web-dev-qa-db-fra.com

C # Une connexion établie a été abandonnée par le logiciel de votre ordinateur hôte.

Ces erreurs sont de plus en plus fréquentes sur mon serveur de jeux. Ils provoquent la fermeture et le redémarrage continuels du serveur ...

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)

C'est le code à partir duquel ces erreurs sont générées:

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

Les tailles de mémoire tampon sont correctement définies, nous utilisons KeepAlive sur le socket et utilisions les délais d’envoi et de réception.

Les gens ont suggéré que la désactivation du pare-feu aiderait, mais chaque fois que je le fais, notre serveur de jeu (serveur dédié) redémarre de lui-même comme s'il était attaqué. Le pare-feu doit donc rester activé.

Quelqu'un d'autre a d'autres solutions pour cela?

PS: Nous sommes derrière les services d'atténuation DDoS, qui peuvent limiter le nombre de connexions ...

41
Richard Williams

Une connexion établie a été interrompue par le logiciel sur votre ordinateur hôte.

C’est un message d’erreur de la chaudière, il vient de Windows. Le code d'erreur sous-jacent est WSAECONNABORTED. Ce qui ne signifie vraiment pas plus que "la connexion a été interrompue". Vous devez faire attention à la partie "votre machine hôte" de la phrase. Dans la grande majorité des programmes d'application Windows, c'est bien l'hôte auquel l'application de bureau est connectée qui a interrompu la connexion. Habituellement, un serveur quelque part ailleurs.

Les rôles sont toutefois inversés lorsque vous implémentez votre propre serveur. Vous devez maintenant lire le message d'erreur comme "abandonné par l'application située à l'autre extrémité du fil". Ce qui n’est évidemment pas inhabituel lorsque vous implémentez un serveur, il n’est pas peu probable que les programmes client utilisant votre serveur interrompent une connexion pour une raison quelconque. Cela peut signifie qu'un pare-feu ou un proxy a mis fin à la connexion, mais ce n'est pas très probable, car ils ne permettraient généralement pas à la connexion d'être établie en premier lieu.

Vous ne savez pas vraiment pourquoi une connexion a été interrompue à moins que vous ne sachiez ce qui se passe à l'autre bout du fil. C'est bien sûr difficile à trouver. Si votre serveur est accessible via Internet, n’écartez pas la possibilité que vous soyez sondé par un scanner de port. Ou vos clients, à la recherche d'une astuce de jeu.

59
Hans Passant