1)阻塞和非阻塞套接字的返回值的含義是否有區別?有時recv()返回0,即使select()在之前成功並且另一側的對等體沒有按照文檔狀態關閉連接的一半。真的嗎?recv和超時問題
來自osx和win的文檔:「對於TCP套接字,返回值0意味着對等關閉了其連接的一半。」
2)對阻塞套接字的問題:在阻塞套接字上我期望SO_RCVTIMEO和SO_SNDTIMEO具有30秒的設置默認值(使用getsockopt檢查)。他們爲什麼設置爲0?
1)阻塞和非阻塞套接字的返回值的含義是否有區別?有時recv()返回0,即使select()在之前成功並且另一側的對等體沒有按照文檔狀態關閉連接的一半。真的嗎?recv和超時問題
來自osx和win的文檔:「對於TCP套接字,返回值0意味着對等關閉了其連接的一半。」
2)對阻塞套接字的問題:在阻塞套接字上我期望SO_RCVTIMEO和SO_SNDTIMEO具有30秒的設置默認值(使用getsockopt檢查)。他們爲什麼設置爲0?
1)阻塞和非阻塞的套接字的返回值的含義是否有區別?
不,但可能的errno/WSAGetLastError()值存在差異,因爲非阻塞模式將EAGAIN/EWOULDBLOCK添加到可能性中。
有時recv()返回0,即使select()在之前成功並且另一側的對等體沒有關閉連接的半邊,因爲文檔狀態。真的嗎?
不,這是不正確的。
從osx和win的文檔:「對於TCP套接字,返回值0意味着對等關閉了其連接的一半。」
正確。與阻塞或非阻塞無關。沒有什麼表明你的問題混亂。
2)對阻塞套接字的問題:在阻塞套接字上,我期望SO_RCVTIMEO和SO_SNDTIMEO具有30秒的設置默認值(使用getsockopt檢查)。
您的預期不正確。默認情況下,它們都是零,意味着無限。
爲什麼它們設置爲0?
因爲這是默認值。默認情況下沒有超時。
所以我放棄了連接,如果recv()返回0,我真的希望仍然有一些數據? – HelloWorld
不,您*關閉*如果recv()返回零連接。永遠不會有更多的數據。 – EJP