我正在撰写可以回复PUT
,GET
,...请求的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文件。
答案 0 :(得分:1)
您的回复中的Content-Length
标头不正确。你的响应的主体长度超过100个字节,而不像标题所说的60个字节。 (如果你的文件使用CR + LF行结尾,它实际上甚至更长。)
通常,Web服务器应生成Content-Length
标头,因为它必须完全匹配响应正文的大小。将其存储在响应中很容易出错。