gpt4 book ai didi

c - 当我从浏览器请求时,如何在服务器程序上使用多线程来连接浏览器并将数据发送到浏览器?

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:47 25 4
gpt4 key购买 nike

我正在尝试在我的服务器程序中使用多线程,这样当我从浏览器收到请求时,我的服务器应该打开一个 txt 文件并将其发送到浏览器进行显示。 我需要做的是有一个单独的函数,每次有来自浏览器(客户端)的请求时,它都会在我的 main 中发送/接收,例如:127.0.0.1:3490/index.txt我设法只用我的主要功能为一个请求做这件事,但我很难把所有东西都放在我的线程函数中并将它发送到浏览器。

我将不胜感激任何帮助以下是我的代码:

#include <stdio.h>
#include<stdlib.h>
#include <winsock.h>
#include <stddef.h>
#define NUM_THREADS 10
#define MYPORT 3490
void *PrintData(void *thread);
int main() {
WSADATA wsaData;
SOCKET s;
unsigned fd;
struct sockaddr_in my_addr;
WSAStartup(MAKEWORD(1, 1), &wsaData);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(my_addr.sin_zero, '\0', sizeof(my_addr.sin_zero) );

s=socket(PF_INET,SOCK_STREAM, 0);
if(s<0) printf("socket failed\n");
if ( (bind(s, (struct sockaddr *)&my_addr, sizeof(my_addr)) ) !=0){ printf("Bind failed!\n");}
listen(s,10);

while(1) {
fd=accept(s,NULL,NULL);
printf("Client connected\r\n");
CreateThread(NULL,(DWORD)NULL,(LPTHREAD_START_ROUTINE)PrintData,(void*)fd,(DWORD)NULL,NULL); // creating threads
}
closesocket(fd);
WSACleanup();
}

void *PrintData(void *thread){
char *header="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
char data[512];
char filename[256];
FILE *f;
printf("It's me, thread!\n");
SOCKET curr_client = (SOCKET)thread;
int res;
while(1){
res=recv(curr_client,data,512,0);
///data[res]=0;
Sleep(10);
if(res == 0) printf("error: res == 0");

sscanf(data,"GET /%s ",filename);
printf("Get: %s %d\n", filename, res);
send(curr_client,header,strlen(header),0);
f=fopen(filename,"rb");
if(f == NULL){ fputs("Can not find the file!", stderr); }
while(!feof(f)){
printf("heloooo");
int retVal = fread(data, 1, sizeof(data), f);
///printf("data is : %s\n", data);
send(curr_client, data, sizeof(data), 0);
}
}
fclose(f);
ExitThread((DWORD)NULL);
}

最佳答案

首先,不要在main函数中关闭fd。现在你根本不会关闭它,因为循环是无限的,这意味着你有一个资源泄漏。您在线程函数中做的最后一件事是调用 closesocket(curr_client);

其次,在线程中你永远循环,永远不会跳出循环。当读取文件出错,到达文件末尾,或者从套接字接收/发送时出错,您应该跳出无限循环。这是遵循 HTTP 规范,即服务器应在每次请求后关闭连接。

关于c - 当我从浏览器请求时,如何在服务器程序上使用多线程来连接浏览器并将数据发送到浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11752583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com