Подтвердить что ты не робот

С# Установленное соединение было прервано программным обеспечением вашей хост-машины

Эти ошибки становятся все более частыми на моем Игровом сервере. Они заставляют сервер продолжать закрывать и перезапускать...

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, которые могут ограничивать количество подключений...

4b9b3361

Ответ 1

Установленное соединение было прервано программным обеспечением вашей хост-машины

Это сообщение об ошибке котельной, оно выходит из Windows. Основной код ошибки WSAECONNABORTED. Что действительно не означает больше, чем "соединение было прервано". Вы должны быть немного осторожны с частью "вашей главной машины" фразы. В подавляющем большинстве прикладных программ Windows на самом деле это хост, к которому подключено настольное приложение, отменившее соединение. Обычно сервер где-то еще.

Роли меняются вспять, когда вы реализуете свой собственный сервер. Теперь вам нужно прочитать сообщение об ошибке как "прерванное приложением на другом проводе". Что, конечно, не редкость при внедрении сервера, клиентские программы, которые используют ваш сервер, вряд ли прервут соединение по любой причине. Это может означать, что fire-wall или proxy завершили соединение, но это не очень вероятно, так как они обычно не позволяли установить соединение в первую очередь.

Вы действительно не знаете, почему соединение было прервано, если у вас нет понимания того, что происходит на другом конце провода. Это, конечно, трудно найти. Если ваш сервер доступен через Интернет, то не уменьшайте вероятность того, что вы исследуете сканер портов. Или ваши клиенты, ищущие обман игры.