【问题标题】:C# An established connection was aborted by the software in your host machineC# 已建立的连接被主机中的软件中止
【发布时间】:2012-12-27 14:22:44
【问题描述】:

这些错误在我的游戏服务器上越来越频繁。它们导致服务器不断关闭并重新启动...

System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine 
   at System.Net.Sockets.Socket.BeginSend(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state) 
   at iRP.Game.Sessions.Session.SendData(Byte[] Data)

这是产生这些错误的代码:

public void SendData(byte[] Data)
{
    try
    {
        if (mSocket == null)
        {
            //Output.WriteLine("[SND] Socket has a null exception, which means it is now invalid. Remove this socket!", OutputLevel.CriticalError);
        }
        else
        {
            mSocket.BeginSend(Data, 0, Data.Length, SocketFlags.None, sendCallback, mSocket);
        }
    }
    catch (Exception e)
    {
        string WhatToWrite = "Error handled (SESSION): " + e.ToString() + "\n\n" + e.Message + "\n\nStack: " + e.StackTrace + Environment.NewLine + "\n\n";
        File.AppendAllText(Environment.CurrentDirectory + "\\data\\fatal.txt", WhatToWrite);
        Program.Stop();
    }
}

缓冲区大小设置正确,我们在套接字上使用 KeepAlive 并使用发送和接收超时。

人们建议禁用防火墙会有所帮助,但每当我这样做时,我们的游戏服务器(专用服务器)都会自行重启,就好像它受到攻击一样,所以防火墙必须保持启用状态。

其他人对此有任何其他解决方案吗?

PS:我们支持 DDoS 缓解服务,这可能会限制连接数...

【问题讨论】:

  • 这些 DDoS 缓解服务到底是什么?您可以在服务器上运行 netstat 命令并查看已建立的连接数,并查看是否超过了您的 DDoS 缓解服务设置的限制
  • 我获得了无限连接,但也许当它说您主机上的软件时,它意味着 DDoS 缓解

标签: c# sockets network-programming


【解决方案1】:

已建立的连接被主机中的软件中止

这是一个样板错误消息,它来自 Windows。底层错误代码是 WSAECONNABORTED。这实际上并不意味着“连接被中止”。您必须对短语的“您的主机”部分小心一点。在绝大多数 Windows 应用程序中,确实是桌面应用程序连接到的主机中止了连接。通常是其他地方的服务器。

但是,当您实现自己的服务器时,角色会颠倒过来。现在您需要将错误消息阅读为“被线路另一端的应用程序中止”。当您实现服务器时,这当然并不少见,使用您的服务器的客户端程序无论出于何种原因都不太可能中止连接。 可能意味着防火墙或代理终止了连接,但这不太可能,因为它们通常一开始就不允许建立连接。

除非您了解线路另一端发生的情况,否则您不会真正知道连接中断的原因。这当然很难得到。如果您的服务器可以通过 Internet 访问,那么不要忽视端口扫描器正在探测您的可能性。或者您的客户,正在寻找游戏作弊。

【讨论】:

  • 嗨,汉斯,我们在通过 FTP 连接到另一个 IP 时也遇到了同样的问题。我们确保双方都没有防病毒或防火墙。奇怪的是,这个问题并没有持续发生:(
  • 那么,如果在连接实际上被连接的远程端中止时使用10053 WSACONNABORTED ConnectionAborted The connection was aborted locally.,那么何时使用10054 WSAECONNRESET ConnectionReset The connection was reset by the other end.
  • 关于重置的废话是什么?这个 Q+A 是关于中止的。
  • 问题是关于中止的。您的部分答案涉及发送休息的情况。不是中止。
  • 当您捕获 Exception 而不是 SocketException 时会发生这种情况。它是 SocketException.ErrorCode
【解决方案2】:

如果两个软件使用相同的端口连接到服务器会出现此问题
尝试根据您的操作系统通过cmd关闭端口
然后重新启动您的 Android 工作室或 Eclipse 或您的软件。

【讨论】:

  • 我认为你是对的。我重新启动了我的机器,问题就消失了
【解决方案3】:

可能与最大并发请求数有关。我可以通过两种解决方案来解决它:

  • 增加最大并发连接的默认限制(默认设置为2):
ServicePointManager.DefaultConnectionLimit = 25
  • 将发送请求包裹在缓冲区周围:可以使用ConcurrentQueue 来限制速率,或者实现如下简单的等待:
while (activeRequests >= maxConcurrentRequests)
    Thread.Sleep(1000);

Interlocked.Increment(ref activeRequests);
var response = await _client.GetStreamAsync(endpoint);
Interlocked.Decrement(ref activeRequests);

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2015-11-03
    • 2022-01-15
    • 2016-05-15
    相关资源
    最近更新 更多