2013-07-13 59 views
0

1)阻塞和非阻塞套接字的返回值的含義是否有區別?有時recv()返回0,即使select()在之前成功並且另一側的對等體沒有按照文檔狀態關閉連接的一半。真的嗎?recv和超時問題

來自osx和win的文檔:「對於TCP套接字,返回值0意味着對等關閉了其連接的一半。」

2)對阻塞套接字的問題:在阻塞套接字上我期望SO_RCVTIMEO和SO_SNDTIMEO具有30秒的設置默認值(使用getsockopt檢查)。他們爲什麼設置爲0?

回答

0

1)阻塞和非阻塞的套接字的返回值的含義是否有區別?

不,但可能的errno/WSAGetLastError()值存在差異,因爲非阻塞模式將EAGAIN/EWOULDBLOCK添加到可能性中。

有時recv()返回0,即使select()在之前成功並且另一側的對等體沒有關閉連接的半邊,因爲文檔狀態。真的嗎?

不,這是不正確的。

從osx和win的文檔:「對於TCP套接字,返回值0意味着對等關閉了其連接的一半。」

正確。與阻塞或非阻塞無關。沒有什麼表明你的問題混亂。

2)對阻塞套接字的問題:在阻塞套接字上,我期望SO_RCVTIMEO和SO_SNDTIMEO具有30秒的設置默認值(使用getsockopt檢查)。

您的預期不正確。默認情況下,它們都是零,意味着無限。

爲什麼它們設置爲0?

因爲這是默認值。默認情況下沒有超時。

+0

所以我放棄了連接,如果recv()返回0,我真的希望仍然有一些數據? – HelloWorld

+0

不,您*關閉*如果recv()返回零連接。永遠不會有更多的數據。 – EJP