我正在开发服务器应用程序,并且在将数据发送回客户端方面存在以下问题,这会突然终止连接。
当我在阻塞套接字上调用send
时,通过setsockopt(SO_SNDTIMEO)
设置写入超时并且客户端在发送期间断开连接(即发送几个字节,然后客户端正确终止TCP - 如wireshark中所示) ,send
仍会阻塞,直到发送超时为止。调用send
后,会按预期返回错误。
我希望TCP终止(FIN / ACK)会导致阻塞send
立即返回,而不是在超时后返回。
有人见过这种行为吗?这是正常的吗?
答案 0 :(得分:0)
不,从客户端发送的FIN不会解除阻止服务器上的send()
。当客户端调用close()
时,FIN将被发送到服务器,并且关闭从客户端到服务器的连接。从服务器到客户端的方向仍然是打开的,直到服务器调用close()
并且FIN被发送到客户端。
当客户端发送FIN并且服务器发回ACK时,服务器上的连接处于 CLOSE_WAIT 状态,客户端上的连接处于 FIN_WAIT_2 状态。服务器仍然可以发送数据,客户端仍然可以接收数据,直到服务器关闭连接。
无法通过send()
检测到关闭连接。只有recv()
检测到对等方关闭了连接。
如果您的代码必须在客户端关闭连接时立即执行操作,则必须调用poll()
或select()
并使用非阻塞send()
和recv()
来电。< / p>