【发布时间】:2012-11-25 11:56:48
【问题描述】:
您好,我正在尝试编写一个非常简单的网络服务器。它将对任何请求响应相同的简单网页。这是代码片段:
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;
}
}
句柄requset函数是:
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\nHello
\r\n";
发生的情况是,该浏览器正在等待(似乎正在接收数据,选项卡中的圆圈正在旋转)并且什么都不显示(尝试了 Firefox 和 Chromium)。只有在我杀死主进程(使用accept())之后,它才会显示页面。
我不知道哪里有问题,我想我做得对。我对于新进程,发送响应并关闭接受返回的描述符并关闭子进程。
【问题讨论】:
-
可能 BUFFSIZE 太小,浏览器仍然尝试发送请求数据(在开始读取响应之前)?
-
BUFFSIZE 为 1000,来自浏览器的请求标头大约有 250 个字节。该程序将打印它发送 57 个字节中的 57 个作为响应。
-
我认为您应该关闭父级中的新文件描述符。
-
你可以。只要有任何进程使用它,它就会处于活动状态。至少,如果我没记错的话。
-
有人写这个作为答案,以便我可以投票并且 user561838 可以接受吗?
标签: c http networking webserver request