recv和超时问题

时间:2013-07-13 11:46:24

标签: sockets timeout blocking nonblocking

1)阻塞和非阻塞的套接字返回值的含义是否存在差异?有时recv()返回0甚至select()成功之前和另一边的对等体没有关闭连接的半边,如文档所述。这是真的吗?

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

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

1 个答案:

答案 0 :(得分:1)

  

1)阻塞和非阻塞的套接字返回值的含义是否存在差异?

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

  

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

不,那不是真的。

  

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

正确。与阻止或非阻塞无关。没有任何迹象表明你的问题存在混淆。

  

2)阻塞套接字的问题:在阻塞套接字上,我预计SO_RCVTIMEO和SO_SNDTIMEO的默认值设置为30秒(使用getsockopt检查)。

您的期望不正确。默认情况下,它们都是零,意味着无限。

  

为什么它们设置为0?

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