1
MSDN說: 「調用發送len參數爲零是允許的,並且會被實現視爲成功。在這種情況下,發送將返回零作爲有效值。對於面向消息的套接字,長度傳輸數據報被髮送。「在什麼情況下winsock會阻塞send()返回0?
我的問題是,如果len參數不爲零,阻塞send()返回0(假設沒有超時設置)?
我也是在網上搜索,發現了以下內容:
http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html
「下的Winsock的SIGPIPE/EPIPE功能不存在於所有:發送()要麼用於正常斷開返回0或-1表示異常斷開連接「。
但是,無論我怎樣努力,我不能模擬「正常斷開」,因此,我不能送()提前返回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
總而言之,無論是什麼原因導致FIN,send()都會成功(FIN收到後首次呼叫),或者由於RST(第二次和未來呼叫)而返回-1。 也就是說,阻塞send()永遠不會返回0嗎?對? (假設沒有超時設置) – JohnTang 2012-04-04 07:47:25