【问题标题】: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() 调用。