为了测试网络应用程序,我编写了一个 asio 端口“代理”:它在一个套接字上监听应用程序客户端事件,并将所有传入的数据包发送到另一个套接字,并在该套接字中被应用程序服务器监听,然后返回。
现在,当应用程序或服务器由于各种原因断开连接时,“代理”通常会收到 EOF,但有时它会收到“连接重置”。
因此,问题来了:套接字何时因“连接重置”错误而失败?
最佳答案
当本地端尝试向远程端发送数据并且远程端使用设置了 RST
标志(而不是 ACK
)。这几乎总是发生,因为远程端不知道任何匹配远程和本地地址以及远程和本地端口号的 TCP 连接。可能的原因包括:
- 远端已经重启
- 路径中某处的状态跟踪防火墙已重新启动/更改/添加/删除
- 负载均衡器错误地将 TCP 连接定向到与它应该去到的节点不同的节点。
- 远程 IP 地址已易手(新所有者对旧所有者的 TCP 连接一无所知)。
- 远端认为TCP连接已经关闭(但不知何故本端不同意)。
请注意,如果远程端使用 RST
数据包应答 TCP 连接中的初始 (SYN
) 数据包,则视为“连接被拒绝”而不是“连接由同行重置”。
关于linux - EOF 套接字失败和连接重置之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816352/