C Web 服务器未通过 GET 请求返回文件。错误:'curl:(52) 来自服务器的空回复'

问题描述 投票:0回答:1

我正在尝试从一个非常基本的 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;
}

我哪里出错了?

c sockets webserver
1个回答
0
投票

HMMMMMMM ....你没有很好地解释你想要做什么。但正如我所猜测的...(我假设您已经收到您在评论中所说的内容,这是

GET /file.html HTML/1.0\r\n
和更多标题。

  1. 你在缓冲区中搜索第一个空格的出现,并在那里放一个0(尽管你没有在任何地方检查错误)这将具有在遇到的第一个空格处剪切/终止缓冲区的效果,只留下字符串
     GET
  2. 然后您尝试打开进程当前目录中的文件
    GET
    (顺便说一句,未知)。这可能是一个错误,因为您当前目录中没有名为
    GET
    的文件。
  3. 您盲目地认为一切都正常,尝试通过套接字描述符发送文件,因为您没有检查代码中任何位置的错误。

每次进行系统调用后,我都会执行以下操作:

int rd = recv(client_fd, buffer, 256, 0);
if (rd < 0) {
    perror("recv");
    exit(1);
}

(嗯,检查实际读取的字节数非常重要,因为来自网络的字节数您永远无法确定缓冲区是否已完全填满,如果是,则它永远不会以字符串 null 结尾,因此您不能使用任何

str
前缀函数)

不确定您会在输入中收到

' '
字符。如果不是这种情况,您将检查完整的
buffer
是否有空格及超出范围(因为
recv
不会终止接收到的字符串),这会导致未定义的行为。最值得注意的是你的程序会崩溃。

如果我的猜测是正确的,那么观察到的结果也将是正确的。您将不会收到任何内容,因为您没有在套接字上发送任何内容。当您关闭连接时,

curl
将向您显示消息。

如果 YouTube 视频中没有建议您检查对系统的每次调用是否有错误,那么您需要更换老师。去学院学习编程,不要用Youtube当学习。主要是因为有一天你会觉得自己完全有能力专业地进行编程,并且你将成为在 Youtube 上发布视频的大量入侵者之一,声称他们在教人们做他们不会做的事情方面做得很好不知道如何做,让这个生意比其他事情更像是一场噩梦。

© www.soinside.com 2019 - 2024. All rights reserved.