1)阻塞和非阻塞套接字的返回值的含义有区别吗?有时recv()返回0,甚至select()在AND之前成功,另一端的对等方没有像文档中所说的那样关闭连接的一半。这是真的吗?
来自osx和win的文档:"对于TCP套接字,返回值0意味着对等方已经关闭了连接的一半。"
2) 关于阻塞套接字的问题:在阻塞套接字上,我希望SO_RCVTIMEO和SO_SNDTIMEO的默认值设置为30秒(使用getsockopt检查)。为什么它们设置为0?
1) 阻塞和非阻塞套接字的返回值的含义有区别吗?
没有。然而,可能的errno/WSAGetLastError()值存在差异,因为非阻塞模式将EAGAIN/EWOULDBLOCK添加到这些可能性中。
有时recv()返回0,甚至select()在AND之前成功,另一端的对等方没有像文档中所说的那样关闭连接的一半。这是真的吗?
不,那不是真的。
来自osx和win的文档:"对于TCP套接字,返回值0意味着对等方已经关闭了连接的一半。"
正确。与阻塞或非阻塞无关。没有任何迹象表明你的问题令人困惑。
2) 关于阻塞套接字的问题:在阻塞套接字上,我希望SO_RCVTIMEO和SO_SNDTIMEO的默认值设置为30秒(使用getsockopt检查)。
你的期望是错误的。默认情况下,它们都是零,意味着无限。
为什么它们设置为0?
因为这是默认值。默认情况下没有超时。