我想要一個簡單的winsock程序工作,所以我創建我的套接字併發送我的數據就好了。那我按照msdn使用shutdown(ConnectSocket, SD_SEND)
,禁止發送數據,但沒有收到? msdn上的例子也是這樣做的。Winsock recv在關機後不工作
但我呼叫shutdown
後,我的recv函數返回0,但沒有收到任何數據。
如果我將關閉代碼註釋掉,那麼所有內容都可以正常工作。
我錯過了什麼嗎?
我想要一個簡單的winsock程序工作,所以我創建我的套接字併發送我的數據就好了。那我按照msdn使用shutdown(ConnectSocket, SD_SEND)
,禁止發送數據,但沒有收到? msdn上的例子也是這樣做的。Winsock recv在關機後不工作
但我呼叫shutdown
後,我的recv函數返回0,但沒有收到任何數據。
如果我將關閉代碼註釋掉,那麼所有內容都可以正常工作。
我錯過了什麼嗎?
不,這很正常。另一方通過關閉來響應你的關機。來自recv
的零回返指示正常連接關閉。如果你不希望另一方關閉它的一半連接,請不要關閉你的連接。
(你是怎麼想到對方做時,其recv
調用返回零?)如果它是一個HTTP協議
我的印象是,如果你指定了'SD_SEND',它只會關閉發送,而不是接收。你必須使用'SD_RECEIVE'來關閉接收。 – Josh 2012-03-23 20:44:07
這是正確的。你關閉你的發送端,另一端通過關閉它的發送端進行響應。這種聯繫的另一方面是什麼?它應該做什麼? (您是否與另一方達成了一些協議來繼續使用半開連接?) – 2012-03-23 20:44:43
這取決於如何在給定協議中解釋關機。例如,在HTTP中,發送請求後客戶端發送關閉是(雖然不常見)不能被解釋爲「不介意你要發送的內容,我不需要回應」。也就是說,如果你正在運行一個簡單的echo服務器,服務器很可能會通過關閉來響應。 – 2012-03-23 20:44:51
,使用連接頭關閉連接或保持打開:
連接:關閉
在這種情況下,你不需要關閉發送
或
連接:保持活躍
接收將循環而不關閉連接
的發送部分你有對方的控制?你知道它是否立即關閉連接,一旦它讀取0字節(它會,一旦你切斷其傳入的數據...)? – cHao 2012-03-23 20:43:46