2013-04-04 207 views
2

为了测试网络应用程序,我编写了一个asio端口“proxy”:它侦听套接字以获取应用程序客户端活动,并将所有传入数据包发送到侦听该套接字的另一个套接字由应用程序服务器返回。socket与EOF和连接重置失败

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

因此,问题是:何时套接字失败并出现“连接重置”错误?

回答

5

TCP连接是“复位”时,本端试图将数据发送到远程端和与该RST标志集(而不是ACK)的分组的远端的答案。这几乎总是发生,因为远程端不知道任何与本地地址和本地端口号相匹配的远程& TCP连接。可能的原因包括:

  • 的远端已经重新启动
  • 甲状态跟踪防火墙某处路径已被重新启动/改变/添加/移除
  • 负载平衡器已经不正确地定向的TCP连接一个不同于它应该去的节点。
  • 远程IP地址已改变(新的所有者不知道属于旧所有者的TCP连接)。
  • 远端认为TCP连接已经关闭(但不知何故本地端不同意)。

注意,如果远端应答初始(SYN)数据包与数据包RST TCP连接,它被认为是“连接被拒绝”,而不是“由对等连接重置”。

+1

有些服务器还故意将'RST'发送给行为异常的客户端以立即丢弃连接,因为简单的'close()'首先发送传出内核套接字缓冲区中待处理的所有数据,然后才发送'FIN'。 – 2013-04-04 19:32:25