233 votes

Une connexion existante a été fermée de force par l'hôte distant.

Je travaille avec une application commerciale qui lance une SocketException avec le message,

Une connexion existante a été fermée de force par l'hôte distant.

Cela se produit lors d'une connexion par socket entre le client et le serveur. La connexion est bien vivante et des tonnes de données sont transférées, mais elle est ensuite déconnectée sans que l'on s'en aperçoive.

Quelqu'un a-t-il déjà vu cela ? Quelles peuvent en être les causes ? Je peux deviner quelques causes, mais y a-t-il un moyen d'en ajouter d'autres dans ce code pour trouver la cause ?

Tous les commentaires et idées sont les bienvenus.

... Les dernières ...

Je dispose d'un certain nombre d'enregistrements provenant d'un traçage .NET,

System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z

System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z 

System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0

Sur la base d'autres parties de l'enregistrement que j'ai vues, le fait qu'il soit dit 0#0 signifie qu'un paquet de 0 octet est envoyé. Mais qu'est-ce que cela signifie vraiment ?

Il y a deux possibilités, et je ne sais pas laquelle,

  1. La connexion est fermée, mais des données sont écrites sur le socket, ce qui crée l'exception ci-dessus. La 0#0 signifie simplement que rien n'a été envoyé car la socket était déjà fermée.

  2. La connexion est toujours ouverte, et un paquet de zéro octet est envoyé (c'est-à-dire que le code a un bogue) et la fonction 0#0 signifie qu'un paquet de zéro octet tente d'être envoyé.

Qu'en pensez-vous ? Je pense que ce n'est pas concluant, mais peut-être que quelqu'un d'autre a vu ce genre de chose ?

144voto

RarrRarrRarr Points 1538

Cela signifie généralement que la partie distante a fermé la connexion (généralement en envoyant un message TCP/IP RST paquet). Si vous travaillez avec une application tierce, les causes probables sont les suivantes :

  • Vous envoyez des données mal formées à l'application (ce qui peut inclure l'envoi d'une requête HTTPS à un serveur HTTP).
  • La liaison réseau entre le client et le serveur est interrompue pour une raison quelconque.
  • Vous avez déclenché un bogue dans l'application tierce qui l'a fait planter.
  • L'application tierce a épuisé les ressources du système

Il est probable que ce soit le premier cas qui se produise.

Vous pouvez allumer Wireshark pour voir exactement ce qui se passe sur le fil afin d'identifier le problème.

En l'absence d'informations plus précises, il est peu probable que quelqu'un ici puisse vraiment vous aider.

134voto

willmaz Points 792

L'utilisation de TLS 1.2 a permis de résoudre cette erreur.
Vous pouvez forcer votre application à utiliser TLS 1.2 avec ceci (assurez-vous de l'exécuter avant d'appeler votre service) :

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Autre solution :
Activez la cryptographie forte sur votre machine locale ou votre serveur afin d'utiliser TLS1.2, car elle est désactivée par défaut et seul TLS1.0 est utilisé.
Pour activer la cryptographie forte, exécutez ces commandes dans PowerShell avec les privilèges d'administrateur :

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

Vous devez redémarrer votre ordinateur pour que ces changements prennent effet.

35voto

Cagatay Dogan Points 71

Il ne s'agit pas d'un bogue dans votre code. Il provient de l'implémentation de Socket de .Net. Si vous utilisez l'implémentation surchargée de EndReceive comme ci-dessous, vous n'obtiendrez pas cette exception.

    SocketError errorCode;
    int nBytesRec = socket.EndReceive(ar, out errorCode);
    if (errorCode != SocketError.Success)
    {
        nBytesRec = 0;
    }

13voto

0x49D1 Points 2565

J'ai eu le même problème. En fait, cela a fonctionné si le trafic était envoyé via un proxy (fiddler dans mon cas). J'ai mis à jour le cadre .NET de 4.5.2 à >=4.6 et maintenant tout fonctionne bien. La requête réelle était :
new WebClient().DownloadData("URL");
L'exception était :

SocketException : Une connexion existante a été fermée de force par l'hôte distant. hôte distant

8voto

ayheber Points 263

Une solution simple pour ce problème ennuyeux et courant :

Il vous suffit de vous rendre dans votre " .context.cs" (situé sous " .context.tt" qui se trouve sous votre fichier "*.edmx").

Ensuite, ajoutez cette ligne à votre constructeur :

public DBEntities() 
        : base("name=DBEntities") 
    { 
        this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE!
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X