簡體   English   中英

C中的HTTP:為什么我必須多次調用recv()?

[英]HTTP in C: Why do I have to call recv() multiple times?

我開始學習C(套接字)和Internet協議中的網絡編程。

目前我專注於HTTP。

在使用C實現HTTP客戶端的(非常)短暫體驗期間,我發現有時您必須多次調用recv()才能從服務器獲取整個消息 - 即使客戶端沒有向客戶端發送消息服務器之間的單獨調用recv()。

例如:

當我嘗試使用recv()調用實現HTTP客戶端時,我只得到了標題(我想,我仍然是HTTP的新手)。 但是當我兩次調用recv()時,我在第一次調用中獲得了頭文件,在第二次調用中獲得了body(html代碼)。

這不是短緩沖區的問題,因為我使用的緩沖區足夠長以容納整個消息。

為什么會這樣? 雖然沒有客戶端發送的新數據,但客戶端必須多次調用recv()的原因是什么? 我認為如果客戶端沒有向服務器發送新數據,對recv()的調用將帶來服務器的整個響應。

我不認為這是我的代碼的問題,但如果你要問代碼,我可以在這里發布它沒有問題。 我認為這是不必要的,如果我錯了,請糾正我。

我不認為這是相關的,但我正在使用Winsock2。

TCP被設計為面向流的。 接收方對發送的消息/數據包一無所知。 它看到的只是一個簡單的字節流。

所以你想像“我發了一條消息”,但是recv()只收到了一半。 事實是,你從未發過郵件。 您發送了一堆字節,並且您無法期望通過一次調用接收所有這些字節。 您可以通過1,2或多個電話接收它們; 您可以收到上一個“消息”的結尾以及下一個消息的開頭,依此類推。

唯一的保證是您將按照它們發送的相同順序接收字節,並且在流關閉之前您將永遠不會收到0字節。 這就是網絡API的工作方式,你必須習慣它。

接收方不知道發送呼叫的數量和每次呼叫的字節數
是在發件人。 你不能說你想要一個10字節的recv
每個發送10個字節。
一個recv調用可以接收三個發送的數據,
或者一個發送的數據可以分成三個接收...
如果它們有時匹配,則純屬巧合。

你可以做的一件事是使用這樣的循環。

    while((recv(socketi,response,sizeof(response)-1,0))>0){
    }
    printf("\n%s",response);

在您發送的請求中,您必須明確說明您正在使用HTTP / 1.0 GET / HTTP/1.0 (在收到所有數據后關閉連接)。 否則它將等待超時發生。

通過這樣做,您將獲得陣列中的所有響應。 無需多次調用recv()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM