2010-04-06 34 views
55

estoy trabajando con una aplicación comercial que está lanzando un SocketException con el mensaje,una conexión existente forzosamente fue cerrada por el host remoto

An existing connection was forcibly closed by the remote host

Esto sucede con una conexión de socket entre el cliente y el servidor. La conexión está viva y bien, y se están transfiriendo 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 en este código para averiguar cuál podría ser la causa?

Cualquier comentario/ideas son bienvenidas.

... La última ...

tengo algo de la tala de algunos trazado .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 

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

Una de las dos posibilidades que está ocurriendo, y no estoy seguro de qué,

1) La conexión se está cerrando, pero los datos a continuación, se están escribiendo en la toma de corriente, creando así la excepción anteriormente. El 0 # 0 simplemente significa que no se envió nada porque el socket ya estaba cerrado.

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

¿A qué te refieres? Puede que no sea concluyente, supongo, pero tal vez alguien más haya visto este tipo de cosas.

+1

Por favor, nadie está dispuesto a adivinar cuál es tu problema. Publica tu código! – ChaosPandion

+0

Haha, OK, lo siento. Pero el código es demasiado grande y complicado para que yo lo entienda y he estado trabajando con él por un tiempo. Iré con wireshark, y si de alguna forma se reduce algo, podría publicar algo de wireshark, y/o algún código, si corresponde. – peter

+0

@peter - No hay necesidad de disculparse. Es difícil escribir con un signo de exclamación y no parecer enojado/hostil. – ChaosPandion

Respuesta

53

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

  • Está enviando los datos con formato incorrecto a la aplicación
  • El enlace de red entre el cliente y el servidor se va hacia abajo por alguna razón
  • Usted ha provocado un error en la aplicación de terceros que provocó que se bloquee
  • la aplicación de terceros ha agotado los recursos del sistema

es probable que el primer caso es lo que sucede de En g.

Puede iniciar Wireshark para ver exactamente lo que está sucediendo en el cable para reducir el problema.

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

+0

Genial. Gracias. La otra cosa sobre wireshark. Reúne tantos datos, ¿cómo podría filtrar algo como esto? Si wireshark muestra algo, podría publicarlo aquí más adelante ... – peter

+2

Debería poder filtrar el volcado de Wireshark por dirección IP y número de puerto, al menos. Después de eso, probablemente sea más útil mirar el final de la transmisión (donde algo salió mal) y trabajar hacia atrás hasta que pueda detectar dónde se confunden las cosas.Dependiendo de la complejidad del protocolo involucrado, puede ser realmente fácil o casi imposible ... – RarrRarrRarr

+3

¿Hay una fuente para los artículos con viñetas, o la respuesta del jugador debajo solo copia tu lista? – Zack

22

Esto no es un error en su código. Viene de la implementación de .Net's Socket. Si usa la implementación sobrecargada de EndReceive como a continuación, no obtendrá esta excepción.

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

cómo hacer esto? – MSaudi

+0

Esto proviene del sistema operativo y, en última instancia, del par. Se requiere una explicación adicional de la alegación de que es un error de software. – EJP

+2

+1. En mi programa C#, me estaba golpeando la cabeza sobre por qué 'EndReceive' lanza una excepción cuando hay una terminación graciosa del cliente. No sabía que esto es por diseño. Siento que su mal diseño arroja excepciones en los flujos de código normales. Gracias a Dios por el método sobrecargado. –

6

solución simple para este problema molesto común:

basta con acceder a su archivo ".context.cs" (que se encuentra bajo " .context.tt" que se encuentra debajo de la "* .edmx" archivo).

A continuación, añadir esta línea a su constructor:

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

esperanza que esto sea útil.

+0

gracias. El error es – Esi

+0

@Esi dónde poner esto? y sin tipo de devolución? –

+1

@FirstStep: Coz esto es un constructor. –

0

Tengo esta excepción porque de referencia circular en la entidad entity.In que se parecen a

public class Catalog 
{ 
    public int Id { get; set; } 
    public int ParentId { get; set; } 
    public Catalog Parent { get; set; } 
    public ICollection<Catalog> ChildCatalogs { get; set; } 
} 

añadí [IgnoreDataMemberAttribute] a la propiedad Parent. Y eso resolvió el problema.

0

Obtuve esta excepción cuando estaba tratando de leer una fila de la base de datos que tenía un nulo en una columna enum, no podía asignar el nulo en un valor enum.

+0

Entonces, ¿cómo lo corrigió? ¿Código? – vapcguy

+0

Establecí un valor en la columna nula que se asignó al valor enum requerido. –

0

Me encontré con esta excepción, cuando la propiedad DateTime de la clase no obtiene el valor. Simplemente lo puedo anular Fecha de hora y Encontré la solución.

public class PlanningBoardBO 
    { 
     ... Other Properties ... 

     public DateTime? PickupDate { get; set; } 

     ... Here changed DateTime to DateTime? 
    } 
4

Tenía el mismo error. Realmente funcionó en caso de que el tráfico se haya enviado utilizando algún proxy (violín en mi caso). Marco .NET actualizado de 4.5.2 a> = 4.6 y ahora todo funciona bien. La solicitud real era:
new WebClient().DownloadData("URL");
La excepción fue:

SocketException: An existing connection was forcibly closed by the remote host

+2

Esta fue una forma de resolver las cosas para mí. En realidad, se relacionó con la versión de TLS .NET utilizada por defecto. 4.5.2 y menor TLS 1.0 utilizado, mientras que 4.6 y superior son más inteligentes sobre permitir 1.1 y 1.2. Esto también fue comprobable al dejar el requisito de TLS en el servidor en 1.0, lo que también solucionó el problema. – HotN

0

Este error se produjo en mi aplicación con el protocolo CIP-siempre que no envió o recibió datos en menos de 10 segundos.

Esto fue causado por el uso del método de apertura directa. Puede evitar esto trabajando con otro método o instalar una tasa de actualización de menos los 10 que mantienen su conexión de apertura anticipada.

Cuestiones relacionadas