Linux - 断开连接发送超时

Linux - timeout on disconnected send

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

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

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

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

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

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

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

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