gpt4 book ai didi

Linux - 断开连接发送超时

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:23 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

关于Linux - 断开连接发送超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com