2014-02-21 27 views
1
sprintf(send_data,"GET/HTTP/1.1\r\nHost: %s\r\n\r\n",hoststr); 
printf("%s",send_data); 
send(sock,send_data,strlen(send_data), 0); 
while(bytes_recieved) 
    { 
    bytes_recieved=recv(sock,recv_data,1024,0); 
    printf("%d\n",bytes_recieved); 
    if(bytes_recieved==0){ break; } 
    recv_data[bytes_recieved] = '\0'; 
    printf("%s" , recv_data); 
    } 

當我請求例如「www.example.com」, 我得到整個頁,然後在最後兩到三秒鐘我得到bytes_received印刷(「0」)後然後循環中斷。構建簡單的HTTP客戶端在C

爲什麼需要2-3秒來打破循環?

有沒有更好的方法來實現簡單的http客戶端然後呢?

謝謝。

+2

在猜測?活着。嘗試使用「HTTP/1.0」 –

+0

HTTP/1.0無需等待2-3秒即可工作爲什麼? –

+3

默認情況下,HTTP 1.1使用「連接:保持活動」。這是因爲大多數網頁都有多個文件需要從服務器上下載;例如,您不必重新連接以獲取CSS。我相信你可以通過在頭文件中指定「Connection:Close」在HTTP 1.1中獲得這種行爲。 –

回答

0

recv返回0這意味着連接的另一端很好地關閉了連接。

從一開始,HTTP就是一個純粹的請求 - 響應協議,每個請求都有一個響應,然後是一個關閉的連接。

你在這裏看到的是,首先你收到請求的頁面,然後超時(由於HTTP協議的新版本(你說你支持)保持連接打開)服務器。

1

作爲HTTP協議的優化,版本1.1添加了默認持久連接(又名Connection: Keep-Alive)。 keep-alive保持連接處於打開狀態,以便您可以通過「可靠」通道發送其他請求;您可以在RFC2616 Section 8.1 - Persistent Connections中找到有關HTTP協議那部分的其他信息。