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

时间:2013-01-13 14:56:30

标签: c# sockets network-programming

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

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缓解服务,可能会限制连接数量......

2 个答案:

答案 0 :(得分:58)

  

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

这是一个样板错误消息,它来自Windows。底层错误代码是WSAECONNABORTED。这真的不仅仅意味着“连接被中止”。你必须要小心这句话的“你的主机”部分。在绝大多数Windows应用程序中,确实是桌面应用程序所连接的主机中断了连接。通常是其他地方的服务器。

但是,当您实现自己的服务器时,角色会颠倒过来。现在,您需要将错误消息读作“由应用程序在另一个网络中止”。当您实现服务器时,这当然并不罕见,使用您的服务器的客户端程序不会因任何原因中止连接。 可以意味着防火墙或代理终止了连接,但这种情况不太可能,因为它们通常不允许首先建立连接。

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

答案 1 :(得分:1)

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