El host remoto cerró a la fuerza una conexión existente

Resuelto peter asked hace 14 años • 21 respuestas

Estoy trabajando con una aplicación comercial que arroja una SocketException con el mensaje,

El host remoto cerró a la fuerza una conexión existente

Esto sucede con una conexión de socket entre el cliente y el servidor. La conexión está viva y bien, y se transfieren montones de datos, pero luego se desconecta de la nada.

Alguien ha visto esto antes? ¿Cuáles podrían ser las causas? Puedo adivinar algunas causas, pero también ¿hay alguna forma de agregar más a este código para determinar cuál podría ser la causa?

Cualquier comentario/idea es bienvenido.

... Lo último ...

Tengo algunos registros de algún rastreo .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

Según otras partes del registro, he visto el hecho de que dice 0#0que se está enviando un paquete de 0 bytes de longitud. Pero, ¿qué significa esto realmente?

Está ocurriendo una de dos posibilidades, y no estoy seguro de cuál,

  1. La conexión se cierra, pero luego se escriben datos en el socket, creando así la excepción anterior. Simplemente 0#0significa que no se envió nada porque el socket ya estaba cerrado.

  2. La conexión todavía está abierta y se está enviando un paquete de cero bytes (es decir, el código tiene un error) y eso 0#0significa que se está intentando enviar un paquete de cero bytes.

¿Que cuentas? Supongo que puede que no sea concluyente, pero ¿quizás alguien más haya visto este tipo de cosas?

peter avatar Apr 06 '10 07:04 peter
Aceptado

Esto generalmente significa que el lado remoto cerró la conexión (generalmente enviando un RSTpaquete TCP/IP). Si está trabajando con una aplicación de terceros, las causas probables son:

  • Está enviando datos con formato incorrecto a la aplicación (lo que podría incluir el envío de una solicitud HTTPS a un servidor HTTP).
  • El enlace de red entre el cliente y el servidor se está cayendo por algún motivo
  • Ha desencadenado un error en la aplicación de terceros que provocó que fallara.
  • La aplicación de terceros ha agotado los recursos del sistema.

Es probable que sea el primer caso lo que está pasando.

Puede iniciar Wireshark para ver exactamente qué está sucediendo en el cable para reducir el problema.

Sin información más específica, es poco probable que alguien aquí pueda ayudarle mucho.

RarrRarrRarr avatar Apr 06 '2010 01:04 RarrRarrRarr

El uso de TLS 1.2 resolvió este error.
Puede forzar su aplicación usando TLS 1.2 con esto (asegúrese de ejecutarlo antes de llamar a su servicio):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Otra solución:
habilite la criptografía segura en su máquina o servidor local para poder usar TLS1.2 porque de forma predeterminada está deshabilitado, por lo que solo se usa TLS1.0.
Para habilitar una criptografía sólida, ejecute estos comandos en PowerShell con privilegios de administrador:

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 

Debe reiniciar su computadora para que estos cambios surtan efecto.

willmaz avatar Jun 07 '2018 16:06 willmaz

Esto no es un error en su código. Proviene de la implementación de Socket de .Net. Si utiliza la implementación sobrecargada de EndReceive como se muestra a continuación, no obtendrá esta excepción.

    SocketError errorCode;
    int nBytesRec = socket.EndReceive(ar, out errorCode);
    if (errorCode != SocketError.Success)
    {
        nBytesRec = 0;
    }
cagatay avatar Jun 15 '2011 12:06 cagatay

Tenía el mismo error. Realmente funcionó en caso de que el tráfico se enviara mediante algún proxy (fiddler en mi caso). Se actualizó .NET framework de 4.5.2 a >=4.6 y ahora todo funciona bien. La solicitud real fue:
new WebClient().DownloadData("URL");
La excepción fue:

SocketException: el host remoto cerró a la fuerza una conexión existente

0x49D1 avatar Jun 09 '2017 15:06 0x49D1