gpt4 book ai didi

c - 用 C 编写非常简单的网络服务器 - 浏览器挂起

转载 作者:可可西里 更新时间:2023-11-01 16:23:20 26 4
gpt4 key购买 nike

您好,我正在尝试编写一个非常简单的网络服务器。它将对任何请求响应相同的简单网页。这是代码片段:

while(1) {

if ((newFd = accept(s, (struct sockaddr *) &clientAddr, &sockAddrSize)) == ERROR) {
printf("error accept\n");
close(s);
return;
}

pid = fork();

if(pid == 0) {
handle_request(newFd);
close(newFd);
return;
}
}

句柄请求函数是:

void handle_request(int newFd) {

int readBytes;
int sendBytes;
readBytes = recv(newFd, buffer, BUFFSIZE, 0);

sendBytes = send(newFd, page, strlen(page), 0);
printf("I have send %d B out of %d B\n", sendBytes, strlen(page));
}

其中 page 是简单的全局变量:

char *page = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello</h1>\r\n";

发生的情况是,浏览器正在等待(似乎正在接收数据,选项卡中的圆圈在旋转)并且什么都不显示(尝试过 Firefox 和 Chromium)。只有在我终止主进程(使用 accept())后,它才会显示该页面。

我不知道哪里可能有问题,我认为我做对了。我对于新进程,发送响应并关闭 accept 返回的描述符并关闭子进程。

最佳答案

浏览器“挂起”了,因为它还在等待数据。它有两种方式知道将不再有数据。通过标明内容长度的 header (content-length) 或通过服务器关闭表明服务器已完成发送的套接字。

您的代码中有两个主要问题,您没有在主进程和 fork 进程中都关闭套接字,但您只是返回,我怀疑您是在主进程中运行它的,而它不会很重要,但一般来说,在 fork 的 child 中调用 exit() 是一种很好的做法。如果您不这样做,它们将继续运行,并可能导致一些令人讨厌且难以发现的错误。如果您不在 while 循环中关闭 newFd,您最终将用完套接字描述符并且您的服务器将无法接受新请求。

关于c - 用 C 编写非常简单的网络服务器 - 浏览器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550777/

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