【问题标题】:Linux - timeout on disconnected sendLinux - 断开发送超时
【发布时间】:2015-04-19 16:16:34
【问题描述】:

我正在开发服务器应用程序,并且在将数据发送回客户端时遇到以下问题,这会突然终止连接。

当我在阻塞套接字上调用send 并通过setsockopt(SO_SNDTIMEO) 设置写入超时并且客户端在发送期间断开连接(即发送了几个字节,然后客户端正确终止了TCP - 如在wireshark 中所见),send仍然阻塞,直到发送超时过去。调用send 后按预期返回错误。

我希望 TCP 终止 (FIN/ACK) 会导致阻塞 send 立即返回,而不是在超时后返回。

有人见过这样的行为吗?正常吗?

【问题讨论】:

    标签: linux sockets send blocking disconnect


    【解决方案1】:

    不,从客户端发送的 FIN 不会在服务器上解除对send() 的阻塞。当客户端调用close() 时,FIN 被发送到服务器,并且从客户端到服务器的连接关闭。从服务器到客户端的方向仍然打开,直到服务器调用close() 并将 FIN 发送到客户端。

    当客户端发送 FIN 并且服务器返回 ACK 时,服务器上的连接处于 CLOSE_WAIT 状态,客户端上的连接处于 FIN_WAIT_2 状态。服务器仍然可以发送数据,客户端仍然可以接收数据,直到服务器关闭连接。

    无法通过send() 检测到关闭连接。只有recv() 检测到对端关闭的连接。

    如果您的代码必须在客户端关闭连接时立即执行操作,那么它必须调用poll()select() 并使用非阻塞send()recv() 调用。

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2013-02-25
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多