【问题标题】:Why does my Client Server Socket Connection Keep Disconnecting为什么我的客户端服务器套接字连接不断断开
【发布时间】:2010-06-23 13:11:14
【问题描述】:

我有一个使用套接字的 C# .NET 客户端服务器应用程序编写器。

我经常收到日志消息(比如说大约每小时 4 条)说这条消息,

An existing connection was forcibly closed by the remote host

在这种情况下,错误发生在“服务器”端。

我决定使用wireshark 来分析正在发生的事情,我明白了。没有延迟,这一切都在几秒钟内发生。

Server > Client [PSH, ACK] Seq=55653 Ack=4472  Win=63940 Len=148
Client > Server [ACK]      Seq=4472  Ack=55801 Win=4038  Len=0
Server > Client [PSH, ACK] Seq=55801 Ack=4472  Win=63940 Len=148
Client > Server [ACK]      Seq=4472  Ack=55949 Win=4001  Len=0 
Server > Client [PSH, ACK] Seq=55949 Ack=4472  Win=63940 Len=142
Client > Server [PSH, ACK] Seq=4472  Ack=55949 Win=4001  Len=31
Client > Server [RST, ACK] Seq=4503  Ack=55949 Win=0     Len=0

因此客户端和服务器在它们之间发送信息 (PSH) 和确认信息 (ACK)。突然发生了 RST。根据维基百科,这是一个重置,这个重置对应于我上面得到的“现有连接被强制...”消息。

这到底是什么意思?这是否意味着重置会导致问题?我认为答案是否定的,更有意义的是重置是问题的结果? IE。服务器端的套接字由于某种原因死了,客户端将重置发送到服务器以尝试唤醒它。

想法?

【问题讨论】:

    标签: c# .net tcp


    【解决方案1】:

    有时行为不端的客户端会获取或发送它想要的东西,然后立即退出(关闭套接字,并突然切断连接)。偶尔在任何暴露在互联网上的服务上看到这种情况是正常的。

    如果是您自己的代码导致了这种情况,请确保您发送任何“我现在完成”命令(常见的是“QUIT”),并在关闭连接之前正确“关闭”连接。除此之外,您应该导致的唯一重置将涉及您的互联网访问中断。

    【讨论】:

    • 那么第一段你指的是黑客对吧?不是这样,但一个很好的观点。您提到发送“我现在完成”命令。我会对此进行调查,因为我认为这可能会有所帮助。但问题是我怀疑它“没有完成”。它不应该关闭它所在的连接,如果是,我希望看到其他类型的错误。
    • 我指的是黑客以及写得不好(但其他方面合法)的客户。只要您的服务器代码可以解释人们做“错误”的事情(合法与否),除了人们知道您在给定端口上运行某些东西之外,您不必担心太多。至于您的客户端为什么要重置连接(如果您的互联网连接稳定,听起来可能就是这种情况),是否有可能触发异常,使代码离开您的 using 块(您 是 i> 使用 using 块,对吗?)并处理套接字?
    【解决方案2】:

    服务器和客户端都是你自己的代码。即使我也遇到过类似的问题,但在我的情况下,服务器不是我的代码,所以我无法真正找出客户端关闭连接并发送 PSH 和 RST 消息的原因。

    在任何一种情况下,如果您遇到类似的错误,建议您创建一个新的套接字并建立通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多