【问题标题】:Problems with recv and timeouts接收和超时问题
【发布时间】:2013-07-13 11:46:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: sockets timeout blocking nonblocking


    【解决方案1】:

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

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

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

    不,那不是真的。

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

    正确。与阻塞或非阻塞无关。没有任何内容表明您的问题存在混淆。

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

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

    为什么它们设置为 0?

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

    【讨论】:

    • 所以如果 recv() 返回 0 我实际上希望还有一些数据,我会中止连接?
    • 不,如果 recv() 返回零,您 关闭 连接。再也不会有任何数据了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2011-04-24
    • 2018-10-12
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多