2014-11-21 124 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

相關問題