0

1)阻塞和非阻塞的套接字的返回值的含义有区别吗?有时 recv() 甚至在 select() 之前成功返回 0 并且另一侧的对等方没有像文档所述那样关闭连接的一半。真的吗?

来自 osx 和 win 的文档:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”

2)阻塞套接字的问题:在阻塞套接字上,我希望 SO_RCVTIMEO 和 SO_SNDTIMEO 有一个设置的默认值,例如 30 秒(使用 getsockopt 检查)。为什么它们设置为0?

4

1 回答 1

1

1)阻塞和非阻塞的套接字的返回值的含义有区别吗?

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

有时 recv() 甚至在 select() 之前成功返回 0 并且另一侧的对等方没有像文档所述那样关闭连接的一半。真的吗?

不,那不是真的。

来自 osx 和 win 的文档:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”

正确的。与阻塞或非阻塞无关。没有什么可以表明您的问题存在混淆。

2)阻塞套接字的问题:在阻塞套接字上,我希望 SO_RCVTIMEO 和 SO_SNDTIMEO 有一个设置的默认值,例如 30 秒(使用 getsockopt 检查)。

你的期望是不正确的。默认情况下,它们都为零,表示无限。

为什么它们设置为0?

因为这是默认值。默认情况下没有超时。

于 2013-07-13T12:27:48.077 回答