1)阻塞和非阻塞的套接字返回值的含义是否存在差异?有时recv()返回0甚至select()成功之前和另一边的对等体没有关闭连接的半边,如文档所述。这是真的吗?
来自osx和win的文档:“对于TCP套接字,返回值0表示对等体已关闭其连接的一半。”
2)阻塞套接字的问题:在阻塞套接字上我期望SO_RCVTIMEO和SO_SNDTIMEO具有设置的默认值,如30秒(使用getsockopt检查)。为什么它们设置为0?
答案 0 :(得分:1)
1)阻塞和非阻塞的套接字返回值的含义是否存在差异?
没有。但是,可能的errno / WSAGetLastError()值存在差异,因为非阻塞模式会为可能性添加EAGAIN / EWOULDBLOCK。
有时recv()返回0甚至select()在AND之前成功,另一方的对等体没有像文档所述那样关闭连接的一半。这是真的吗?
不,那不是真的。
来自osx和win的文档:“对于TCP套接字,返回值0表示对等体已关闭其连接的一半。”
正确。与阻止或非阻塞无关。没有任何迹象表明你的问题存在混淆。
2)阻塞套接字的问题:在阻塞套接字上,我预计SO_RCVTIMEO和SO_SNDTIMEO的默认值设置为30秒(使用getsockopt检查)。
您的期望不正确。默认情况下,它们都是零,意味着无限。
为什么它们设置为0?
因为这是默认值。默认情况下没有超时。