如何用c语言通过tcp发送http协议的html文件?

时间:2014-11-21 15:41:11

标签: html c sockets http tcp

我正在撰写可以回复PUTGET,...请求的HTTP网络服务器 当从浏览器发送GET请求时,浏览器应该接收相关的HTML文件 我已经分析了Wireshark中的GET请求,它发送了网站的整个HTML文件 然后浏览器请求HTML文件中使用的其余文件

我的问题是,当我使用send()函数并发送和HTTP响应GET请求时,包含HTML文件的HTTP消息的正文部分在浏览器中无法正确显示它是从HTML文件中读取的,但当我将HTML文件键入字符串变量并将其提供给send()函数时,它可以正常工作。

这是我的代码:

char send_buffer[1000];
FILE *sendFile = fopen("foo.txt", "r");
while( !feof(sendFile) )
{
int numread = fread(send_buffer, sizeof(unsigned char), 1000, sendFile);
if( numread < 1 ) break; // EOF or error

char *send_buffer_ptr = send_buffer;
do
{
    int numsent = send(connected, send_buffer_ptr, numread, 0);
    if( numsent < 1 ) // 0 if disconnected, otherwise error
    {
        if( numsent < 0 )
        {
            if( WSAGetLastError() == WSAEWOULDBLOCK )
            {
                fd_set wfd;
                FD_ZERO(&wfd);
                FD_SET(connected, &wfd);

                timeval tm;
                tm.tv_sec = 10;
                tm.tv_usec = 0;

                if( select(0, NULL, &wfd, NULL, &tm) > 0 )
                    continue;
            }
        }

        break; // timeout or error
    }

    send_buffer_ptr += numsent;
    numread -= numsent;
}
while( numread > 0 );
}

我已经使用包含HTTP标头和一些HTML代码的foo文件测试了代码,如下所示:

HTTP/1.1 200 OK
Content-length: 60
Content-Type: text/html


<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>
</html>

我还尝试使用单独的发送功能发送标头,并在其后发送带有另一个发送功能的HTML文件。

1 个答案:

答案 0 :(得分:1)

您的回复中的Content-Length标头不正确。你的响应的主体长度超过100个字节,而不像标题所说的60个字节。 (如果你的文件使用CR + LF行结尾,它实际上甚至更长。)

通常,Web服务器应生成Content-Length标头,因为它必须完全匹配响应正文的大小。将其存储在响应中很容易出错。