web-dev-qa-db-ja.com

C#ホストマシンのソフトウェアによって確立された接続が中断されました

これらのエラーは、ゲームサーバーでますます頻繁になっています。それらはサーバーを閉じ、再起動させ続けています...

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軽減サービスの背後にいます...

41

確立された接続は、ホストマシンのソフトウェアによって中止されました

これは定型エラーメッセージであり、Windowsから発生します。基礎となるエラーコードはWSAECONNABORTEDです。これは、実際には「接続が中断された」という意味ではありません。フレーズの「ホストマシン」の部分に注意する必要があります。 Windowsアプリケーションプログラムの大半では、実際にデスクトップアプリが接続されているのはホストであり、接続を中断しました。通常、どこか別のサーバー。

ただし、独自のサーバーを実装すると、役割は逆になります。ここで、「通信相手のアプリケーションによって中断された」というエラーメッセージを読む必要があります。サーバーを実装するとき、これはもちろん珍しいことではありません。サーバーを使用するクライアントプログラムは、何らかの理由で接続を中断する可能性はありません。それはcanファイアウォールまたはプロキシが接続を終了したことを意味しますが、通常は最初に接続を確立することを許可しないため、それはほとんどありません。

ワイヤのもう一方の端で何が起こっているのかについての洞察がない限り、接続が中断された理由は本当にわかりません。それはもちろん手に入れるのが難しいです。サーバーがインターネット経由で到達可能な場合は、ポートスキャナーで調査されている可能性を軽視しないでください。または、顧客がゲームのチートを探しています。

59
Hans Passant