2012-04-03 113 views
1

MSDN說: 「調用發送len參數爲零是允許的,並且會被實現視爲成功。在這種情況下,發送將返回零作爲有效值。對於面向消息的套接字,長度傳輸數據報被髮送。「在什麼情況下winsock會阻塞send()返回0?

我的問題是,如果len參數不爲零,阻塞send()返回0(假設沒有超時設置)?

我也是在網上搜索,發現了以下內容:

http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

「下的Winsock的SIGPIPE/EPIPE功能不存在於所有:發送()要麼用於正常斷開返回0或-1表示異常斷開連接「。

但是,無論我怎樣努力,我不能模擬「正常斷開」,因此,我不能送()提前返回0

感謝。

回答

0

「正常」斷開連接是指接收方在連接結束時呼叫closesocket()向發送方發送FIN數據包。當send()檢測到FIN時,它知道連接已正常斷開連接並應返回0來通知您的代碼。

+0

即使收到FIN,send()仍然會成功。 FIN可能由closesocket,關閉(SD_SEND),關閉(SD_BOTH)引起。 對於關閉(SD_SEND)的情況,隨後的send()將始終成功,因爲另一方(稱爲關閉(SD_SEND))應該接收任何進一步的數據。但是,對recv()的調用將返回0. 對於closesocket和shutdown(SD_BOTH)(還有shutdown(SD_RECEIVE)),第一個send()仍然會成功;但是,RST將被退回。下一次調用send()或recv()時,將返回SOCKET_ERROR(-1)。 – JohnTang 2012-04-04 07:46:11

+0

總而言之,無論是什麼原因導致FIN,send()都會成功(FIN收到後首次呼叫),或者由於RST(第二次和未來呼叫)而返回-1。 也就是說,阻塞send()永遠不會返回0嗎?對? (假設沒有超時設置) – JohnTang 2012-04-04 07:47:25

相關問題