C套接字Web服务器未在浏览器中显示html,仅发送HTTP响应

时间:2018-11-09 22:51:35

标签: c sockets http

我对C语言比较陌生,他尝试使用教授给我的一些代码,然后从那时起对其进行修改,以帮助我完成服务器项目。我无法弄清楚如何真正能够在lynx中看到HTML,我只是得到HTTP响应。 (我可以卷曲它并查看我要发送的内容,但是浏览器将不会加载HTML正文)我一直在检查我能想到的所有内容,但是在这一点上我不得不承认我对HTTP并不了解回应,并可以朝着正确的方向迈出一步。

-c-1

1 个答案:

答案 0 :(得分:1)

    memset( buffer, 0, BUFFER_SIZE );
    n = read( new_socket_fd, buffer, ( BUFFER_SIZE-1 ) );
    if (n==0){
        fprintf( stderr, "Connection to client lost\n\n" );
        break;
    }
    else if( n < 0 ){
        fprintf(stderr,"Error reading from socket %s\n",
            strerror(errno));
    }

    /* Print the message we received */
    printf("Message received: %s\n" ,buffer);

在TCP连接上调用read时,您不会收到任何消息。如果要接收HTTP消息,则必须编写代码来做到这一点。这只是坏了。

sprintf( send_client, "HTTP/1.0 %s%s\r\nServer: ECE435\r\n"
   "Last-Modified: Fri, 08 Sep 2017 04:31:47 GMT\r\n"
   "Content-Length: 85\r\nContent-Type: text/html\r\n\r\n", HTTP__OK, timestamp );

除非文件恰好恰好包含85个字节,否则发送“ Content-Length”标头并不是一个好主意。

您有一个while(1)循环,似乎正在尝试通过单个连接接收多个消息。但是没有代码来确定您何时真正收到了HTTP请求,因此绝对无法正常工作。

HTTP协议很复杂,要正确地实现它,编写代码需要经过该标准并实现该标准所需的所有内容。这段代码并没有做到这一点,如果它确实起作用了,那将主要是靠运气。

您可能只是修改“ Content-Length”标头以使其具有正确的长度而无所适从。但是您仍然违反许多规则。例如,由于不确保read返回整个HTTP请求,因此可以轻松地对一个请求发送多个响应。