我正在尝试从一个非常基本的 C 网络服务器程序开始。我尝试按照 YouTube 上的这个示例进行操作 - https://www.youtube.com/watch?v=2HrYIl6GpYg。所以我的代码几乎是逐字逐句的。 Web 服务器应该通过 GET 请求返回一个 index.html 文件。但当我运行
curl: (52) Empty reply from server
时,我只收到错误 curl --http0.9 --output - 'http://localhost:8080/index.html'
。
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdio.h>
int main() {
int PORT;
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(s, (struct sockaddr *)&addr, sizeof(addr));
listen(s, 10);
int client_fd = accept(s, 0, 0);
char buffer[256] = {0};
recv(client_fd, buffer, 256, 0);
// GET /file.html .....
char* f = buffer + 5;
printf("%s", f);
*strchr(f, ' ') = 0;
printf("After strch:\n%s", f);
int opened_fd = open(f, O_RDONLY);
send(client_fd, &opened_fd, 256, NULL);
//sendfile(opened_fd, client_fd, 0, 0, 0, 0);
close(opened_fd);
close(client_fd);
close(s);
return 0;
}
我哪里出错了?
HMMMMMMM ....你没有很好地解释你想要做什么。但正如我所猜测的...(我假设您已经收到您在评论中所说的内容,这是
GET /file.html HTML/1.0\r\n
和更多标题。
GET
。GET
(顺便说一句,未知)。这可能是一个错误,因为您当前目录中没有名为 GET
的文件。每次进行系统调用后,我都会执行以下操作:
int rd = recv(client_fd, buffer, 256, 0);
if (rd < 0) {
perror("recv");
exit(1);
}
(嗯,检查实际读取的字节数非常重要,因为来自网络的字节数您永远无法确定缓冲区是否已完全填满,如果是,则它永远不会以字符串 null 结尾,因此您不能使用任何
str
前缀函数)
不确定您会在输入中收到
' '
字符。如果不是这种情况,您将检查完整的 buffer
是否有空格及超出范围(因为 recv
不会终止接收到的字符串),这会导致未定义的行为。最值得注意的是你的程序会崩溃。
如果我的猜测是正确的,那么观察到的结果也将是正确的。您将不会收到任何内容,因为您没有在套接字上发送任何内容。当您关闭连接时,
curl
将向您显示消息。
如果 YouTube 视频中没有建议您检查对系统的每次调用是否有错误,那么您需要更换老师。去学院学习编程,不要用Youtube当学习。主要是因为有一天你会觉得自己完全有能力专业地进行编程,并且你将成为在 Youtube 上发布视频的大量入侵者之一,声称他们在教人们做他们不会做的事情方面做得很好不知道如何做,让这个生意比其他事情更像是一场噩梦。