Linux - 断开连接发送时超时

时间:2015-02-18 15:34:13

标签: linux sockets send blocking disconnect

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

如果您的代码必须在客户端关闭连接时立即执行操作,则必须调用poll()select()并使用非阻塞send()recv()来电。< / p>