2012-03-23 37 views
1

我想要一個簡單的winsock程序工作,所以我創建我的套接字併發送我的數據就好了。那我按照msdn使用shutdown(ConnectSocket, SD_SEND),禁止發送數據,但沒有收到? msdn上的例子也是這樣做的。Winsock recv在關機後不工作

但我呼叫shutdown後,我的recv函數返回0,但沒有收到任何數據。
如果我將關閉代碼註釋掉,那麼所有內容都可以正常工作。

我錯過了什麼嗎?

+0

的發送部分你有對方的控制?你知道它是否立即關閉連接,一旦它讀取0字節(它會,一旦你切斷其傳入的數據...)? – cHao 2012-03-23 20:43:46

回答

2

不,這很正常。另一方通過關閉來響應你的關機。來自recv的零回返指示正常連接關閉。如果你不希望另一方關閉它的一半連接,請不要關閉你的連接。

(你是怎麼想到對方做時,其recv調用返回零?)如果它是一個HTTP協議

+0

我的印象是,如果你指定了'SD_SEND',它只會關閉發送,而不是接收。你必須使用'SD_RECEIVE'來關閉接收。 – Josh 2012-03-23 20:44:07

+2

這是正確的。你關閉你的發送端,另一端通過關閉它的發送端進行響應。這種聯繫的另一方面是什麼?它應該做什麼? (您是否與另一方達成了一些協議來繼續使用半開連接?) – 2012-03-23 20:44:43

+0

這取決於如何在給定協議中解釋關機。例如,在HTTP中,發送請求後客戶端發送關閉是(雖然不常見)不能被解釋爲「不介意你要發送的內容,我不需要回應」。也就是說,如果你正在運行一個簡單的echo服務器,服務器很可能會通過關閉來響應。 – 2012-03-23 20:44:51

-3

,使用連接頭關閉連接或保持打開:

連接:關閉

在這種情況下,你不需要關閉發送

連接:保持活躍

接收將循環而不關閉連接