linux - EOF 套接字失败和连接重置之间的区别

标签 linux sockets networking

为了测试网络应用程序,我编写了一个 asio 端口“代理”:它在一个套接字上监听应用程序客户端事件,并将所有传入的数据包发送到另一个套接字,并在该套接字中被应用程序服务器监听,然后返回。

现在,当应用程序或服务器由于各种原因断开连接时,“代理”通常会收到 EOF,但有时它会收到“连接重置”。

因此,问题来了:套接字何时因“连接重置”错误而失败?

最佳答案

当本地端尝试向远程端发送数据并且远程端使用设置了 RST 标志(而不是 ACK)。这几乎总是发生,因为远程端不知道任何匹配远程和本地地址以及远程和本地端口号的 TCP 连接。可能的原因包括:

  • 远端已经重启
  • 路径中某处的状态跟踪防火墙已重新启动/更改/添加/删除
  • 负载均衡器错误地将 TCP 连接定向到与它应该去到的节点不同的节点。
  • 远程 IP 地址已易手(新所有者对旧所有者的 TCP 连接一无所知)。
  • 远端认为TCP连接已经关闭(但不知何故本端不同意)。

请注意,如果远程端使用 RST 数据包应答 TCP 连接中的初始 (SYN) 数据包,则视为“连接被拒绝”而不是“连接由同行重置”。

关于linux - EOF 套接字失败和连接重置之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816352/

相关文章:

c++ - 使用 system() 函数调用防止通配符扩展

sockets - 如何在IE11中正确hook WSARecv

linux - SSH 跨网络中的所有机器,怎么样?

python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?

linux - 从单个字符中查找单词

linux - BusyBox:制作过程中出错

php - 可靠的 mp3 分割 php 类或任何 Linux 工具

javascript - Socket.io.js 未加载

c++ - 套接字调用在同时执行的两个或多个线程上提供重复的文件描述符(竞争条件)

sockets - TCP 套接字是否需要有线连接?