65 Stimmen

C# Eine bestehende Verbindung wurde von der Software auf Ihrem Host-Rechner abgebrochen

Diese Fehler treten auf meinem Game Server immer häufiger auf. Sie führen dazu, dass der Server immer wieder geschlossen und neu gestartet wird...

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)

Dies ist der Code, aus dem diese Fehler generiert werden:

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();
    }
}

Die Puffergrößen sind korrekt eingestellt, wir verwenden KeepAlive für den Socket und verwenden Sende- und Empfangs-Timeouts.

Es wurde vorgeschlagen, die Firewall zu deaktivieren, aber immer, wenn ich dies tue, startet sich unser Spieleserver (Dedicated Server) neu, als ob er angegriffen würde, also muss die Firewall aktiviert bleiben.

Hat jemand eine andere Lösung für dieses Problem?

PS: Wir sind hinter DDoS Mitigation Services, die die Anzahl der Verbindungen begrenzen können...

87voto

Hans Passant Punkte 894572

Eine bestehende Verbindung wurde von der Software auf Ihrem Host-Rechner abgebrochen

Das ist eine Standard-Fehlermeldung, die von Windows kommt. Der zugrunde liegende Fehlercode ist WSAECONNABORTED. Das bedeutet eigentlich nicht mehr als "Verbindung wurde abgebrochen". Mit dem Teil "Ihr Host-Rechner" des Satzes müssen Sie etwas vorsichtig sein. In der überwiegenden Mehrheit der Windows-Anwendungsprogramme ist es tatsächlich der Host, mit dem die Desktop-Anwendung verbunden ist, der die Verbindung abgebrochen hat. Normalerweise ist es ein Server irgendwo anders.

Die Rollen sind jedoch vertauscht, wenn Sie Ihren eigenen Server einrichten. Jetzt müssen Sie die Fehlermeldung als "von der Anwendung am anderen Ende der Leitung abgebrochen" lesen. Das ist natürlich nicht ungewöhnlich, wenn Sie einen Server implementieren. Es ist nicht unwahrscheinlich, dass Client-Programme, die Ihren Server benutzen, eine Verbindung aus irgendeinem Grund abbrechen. Es puede bedeuten, dass eine Firewall oder ein Proxy die Verbindung abgebrochen hat, aber das ist nicht sehr wahrscheinlich, da sie normalerweise den Verbindungsaufbau gar nicht erst zulassen würden.

Sie können nicht wirklich wissen, warum eine Verbindung abgebrochen wurde, wenn Sie nicht wissen, was am anderen Ende der Leitung vor sich geht. Das ist natürlich schwer zu bekommen. Wenn Ihr Server über das Internet erreichbar ist, sollten Sie die Möglichkeit nicht ausschließen, dass Sie von einem Port-Scanner überprüft werden. Oder Ihre Kunden suchen nach einem Spielbetrug.

6voto

yacine Punkte 127

Dieses Problem tritt auf, wenn zwei Programme denselben Port für die Verbindung zum Server verwenden
Versuchen Sie, den Port mit cmd entsprechend Ihrem Betriebssystem zu schließen
Starten Sie dann Ihr Android-Studio oder Ihr Eclipse oder Ihre Software neu.

2voto

MoralCode Punkte 1851

Während die Antwort von Hans eine ausgezeichnete Zusammenfassung des Fehlers ist, die mir einen guten Einstieg ermöglichte, fand ich am Ende eine Seite die die Ursache so gut erklärt, dass ich sie mit einem Python-Skript nachstellen konnte.

Die Seite enthält mehrere Beschreibungen dieses Fehlers, die detaillierter sind als die Umschreibung "Verbindung wurde abgebrochen" aus Hans' Antwort, aber immer noch ziemlich kryptisch und nicht sehr informativ.

In dem Beitrag wird dann das Szenario erläutert, bei dem der Fehler auftritt:

Ein HTTP POST soll an einen HTTP-Server gesendet werden. Der Server beginnt mit dem Lesen der POST und stellt fest, dass der HTTP-Request-Header ungültig ist. Er sendet sofort eine HTTP-Antwort (mit einem Fehlerstatus, z. B. status=400) und schließt die Verbindung, ohne zu versuchen, den Rest der anstehenden HTTP-Anfrage weiter zu lesen.

In der Zwischenzeit schreibt der Client immer noch fröhlich den Rest der HTTP-Anfrage in den Socket. (Denken Sie daran, dass eine TCP/IP-Socket-Verbindung von beiden Seiten geschlossen werden muss. In diesem Fall hat der Server seine Seite geschlossen, aber der Client pumpt immer noch Daten in die halboffene Verbindung). Der Client beendet das Schreiben der HTTP-POST an den Socket, d. h. die Daten wurden an Winsock gepuffert. Die Client-Anwendung versucht dann, die HTTP-Antwort zu lesen, kann dies aber nicht, weil die ausgehende Neuübertragung (der gepufferten Daten durch WinSock) fehlgeschlagen ist und die Socket-Verbindung auf der Client-Seite (durch Winsock) beendet wurde. Obwohl der HTTP-Server die Antwort gesendet hat, ist sie verloren und kann nicht abgerufen werden. Der Fehler, den Ihre Anwendung erhält, wenn sie versucht, die HTTP-Antwort auf dem Socket zu lesen, lautet WSAECONNABORTED

Wikipedia hat auch eine Seite zu erklären, was winsock ist aber alles, was Sie für dieses Szenario wirklich wissen müssen, ist, dass es sich um die Windows-Socket-API handelt.

1voto

Saul Punkte 26

Ich hatte den "ManageEngine Agent" auf meinem Computer installiert, der meine Verbindung zu den Datenbanken blockierte, also war die Deinstallation die Lösung.

Prüfen Sie, welche Anwendung die Verbindung zu Ihrer DB blockieren könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X