2014-11-21 122 views
0

我正在写,可以到PUT响应,GET一个HTTP Web服务器,......要求 时GET请求从浏览器发送,浏览器应该接受相关的HTML文件 我分析在Wireshark的的GET请求它会将网站 整个HTML文件,然后在浏览器请求是在HTML文件中使用的文件的其余部分如何用c语言通过tcp以http协议发送html文件?

我的问题是,当我使用send()功能发送和HTTP到GET请求作出回应当从HTML文件bu读取时,包含HTML文件的HTTP消息的正文部分在浏览器中无法正确显示t当我将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

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

一般来说,Content-Length头应该由Web服务器生成的,因为它必须正好匹配响应主体的大小。将它存储在响应中太容易出错。

+0

我没有问题通过减少内容长度来发送HTML代码的一部分,主要问题是,当从文件中读取相同的HTML代码并将其发送到浏览器时,它仅显示为HTML代码 – 2014-11-21 17:24:39

+0

After发送文件的确切内容长度的工作! 非常感谢。 – 2014-11-21 19:17:07

+0

考虑在响应中使用'Transfer-Encoding:chunked',那么您根本不需要'Content-Length'头,您可以在从文件中读取文件数据时发送文件数据,并且可以向客户端发送信号在结束时以0长度的块结束。 – 2014-11-22 16:31:38

相关问题