1)阻塞和非阻塞的套接字的返回值的含义有区别吗?有时 recv() 甚至在 select() 之前成功返回 0 并且另一侧的对等方没有像文档所述那样关闭连接的一半。真的吗?
来自 osx 和 win 的文档:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”
2)阻塞套接字的问题:在阻塞套接字上,我希望 SO_RCVTIMEO 和 SO_SNDTIMEO 有一个设置的默认值,例如 30 秒(使用 getsockopt 检查)。为什么它们设置为0?
1)阻塞和非阻塞的套接字的返回值的含义有区别吗?有时 recv() 甚至在 select() 之前成功返回 0 并且另一侧的对等方没有像文档所述那样关闭连接的一半。真的吗?
来自 osx 和 win 的文档:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”
2)阻塞套接字的问题:在阻塞套接字上,我希望 SO_RCVTIMEO 和 SO_SNDTIMEO 有一个设置的默认值,例如 30 秒(使用 getsockopt 检查)。为什么它们设置为0?
1)阻塞和非阻塞的套接字的返回值的含义有区别吗?
不,但是可能的 errno/WSAGetLastError() 值存在差异,因为非阻塞模式将 EAGAIN/EWOULDBLOCK 添加到可能性中。
有时 recv() 甚至在 select() 之前成功返回 0 并且另一侧的对等方没有像文档所述那样关闭连接的一半。真的吗?
不,那不是真的。
来自 osx 和 win 的文档:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”
正确的。与阻塞或非阻塞无关。没有什么可以表明您的问题存在混淆。
2)阻塞套接字的问题:在阻塞套接字上,我希望 SO_RCVTIMEO 和 SO_SNDTIMEO 有一个设置的默认值,例如 30 秒(使用 getsockopt 检查)。
你的期望是不正确的。默认情况下,它们都为零,表示无限。
为什么它们设置为0?
因为这是默认值。默认情况下没有超时。