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()
调用.
我正在开发服务器应用程序,在将数据发送回客户端时遇到以下问题,连接突然终止。
当我在通过 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()
调用.