首页 文章

简单的Web服务器

提问于
浏览
1

我正在尝试使用c编写一个简单的HTTP Web服务器,但在尝试创建它时我一直遇到问题 . 创建服务器套接字的一切似乎都很好;基本上我只是不明白如何将内容发送到浏览器 . 以下是我的代码的摘录,其中服务器循环以创建与客户端的套接字连接,然后将内容发送到网页:

for (;;) /* Run forever */
    {
        /* Set the size of the in-out parameter */
        clntLen = sizeof(clntAddr);

        /* Wait for a client to connect */
        if ((clntSock = accept(servSock, (struct sockaddr *) &clntAddr,
                               &clntLen)) < 0)
            DieWithError("accept() failed");

        /* clntSock is connected to a client! */

        printf("Handling client %s\n", inet_ntoa(clntAddr.sin_addr));

        FILE *clientInput = fdopen(clntSock, "r");
        char input[1000];
        char html[BUFSIZE];

        fgets(input, 1000, clientInput);

        char  *token_separators = "\t \r \n";
        char *method = strtok(input, token_separators);
        char *requestURI = strtok(NULL, token_separators);
        char *httpVersion = strtok(NULL, token_separators);
        ...
        char requestMessage[] = "HTTP/1.0 200 OK\r\n\r\n";
        send(clntSock, requestMessage, strlen(requestMessage) + 1, 0);
        ...  

}

我很确定我的代码适用于套接字创建和连接,只是当我尝试发送此响应头时,我的网页只是不断尝试下载html . 当我不发送响应标头并且我尝试发送正常的html时,我的页面正常工作 .

我想我不明白的是为什么我的响应 Headers 不起作用 .

1 回答

  • 0

    看到带有套接字的 FILE * 非常不寻常 . 使用 read / recvwrite / send 更为典型 . 这使您可以更轻松地进行错误处理 .

    也就是说,如果没有 Headers ,浏览器会认为您的服务器正在运行HTTP / 0.9 - 而且一切都是HTML . 为了使事情正常,请添加另一个:

    HTTP/1.0 200 OK
    Content-Type: text/html;charset=iso-8859-1
    
    <html>
    ...
    

    当然,这仍然缺少一些部分,但它是一个开始,大多数浏览器应该接受它没有抱怨 . 您可以查看RFC并找到需要支持的请求方法(GET和HEAD)以及您需要生成的响应头(服务器,日期) . (我希望你这样做是为了学习目的,而不是为了制作 . )

    您可以非常轻松地使用netcat测试响应:

    $ cat file
    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Hello, World
    $ nc -l 8000 < file
    

    然后浏览到http://localhost:8000 . 注意上面的工作与BSD netcat有关,如果你有GNU netcat,你需要阅读手册页 .

相关问题