2011-08-26 38 views
14

necesito obtener datagrama UDP desde asíncrono Socket Server, pero se produjo una excepción en mi solicitud:una conexión existente forzosamente fue cerrada por el host remoto

problema aparece allí:

Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 

El código fuente completo :

class Program 
    { 
     static void Main(string[] args) 
     { 
      const int PORT = 30485; 
      IPAddress IP; 
      IPAddress.TryParse("92.56.23.87", out IP); 
      // This constructor arbitrarily assigns the local port number. 
      UdpClient udpClient = new UdpClient(PORT); 
      Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      try 
      { 
       udpClient.Connect("92.56.23.87", PORT); 

       if (udpClient.Client.Connected) 
        Console.WriteLine("Connected."); 

       // Sends a message to the host to which you have connected. 
       Byte[] sendBytes = Encoding.ASCII.GetBytes("CONNECT"); 

       udpClient.Send(sendBytes, sendBytes.Length); 

       //IPEndPoint object will allow us to read datagrams sent from any source. 
       IPEndPoint RemoteIpEndPoint = new IPEndPoint(IP, PORT); 

       // Blocks until a message returns on this socket from a remote host. 
       Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 
       string returnData = Encoding.ASCII.GetString(receiveBytes); 
       // Uses the IPEndPoint object to determine which of these two hosts responded. 
       Console.WriteLine("This is the message you received " + returnData.ToString()); 
       Console.WriteLine("This message was sent from " + RemoteIpEndPoint.Address.ToString() + " on their port number " + RemoteIpEndPoint.Port.ToString()); 

       udpClient.Close(); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 

      } 
     } 
    } 

Excepción:

Connected. 
System.Net.Sockets.SocketException (0x80004005): An existing connection 
was forcibly closed by the remote host at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP) at ystem.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP) at ConsoleApplication7.Program.Main(String[] args) in c:\users\user\documents\visual studio 2010\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs 

¿Cuál puede ser el problema?


para proporcionar más información, compré la conexión calcetines privada en esta página: http://rapidsocks.com/ estos servicios me dan una lista de IP y el puerto que en realidad no es un proxy .. sólo una conexión que me dan una proxyIP: proxyPort de un grupo en el servidor en respuesta ...

¿Cómo obtener esa respuesta con proxyIP: proxyPort desde el servidor?

+0

buena pregunta - tal vez si nos dice un poco más - donde se produce la excepción? ¿Ves alguno de tus "mensajes de depuración" en la consola? ¿Puedes mostrarnos una prueba de ejecución? – Carsten

+0

Haga una impresión de stackTrace en el bloque catch y vea qué línea está lanzando la excepción. – Zenwalker

+0

el * otro lado * funciona correctamente, ¿o sí? ¿Puedes verificar esto? – Carsten

Respuesta

3

Esto realmente es un mensaje de error genérico que podría significar cualquier cosa. Es hora de que los rastreadores de tráfico de red de bajo nivel filtren lo que realmente está fallando. Agregar un manejo de error adicional probar los bloques de captura en el servidor con un registro decente siempre es un buen lugar para comenzar.

+0

es un servidor con servicios de proxy, es privado y cualquier información sobre cómo obtener la IP: el puerto en interno se escribe en rfc1928 – Johnny

+0

CONNECT En la respuesta a un CONNECT, BND.PORT contiene el número de puerto que el servidor asignó para conectarse al host de destino, mientras que BND.ADDR contiene la dirección IP asociada.El BND.ADDR suministrado a menudo es diferente de la dirección IP que utiliza el cliente para llegar al servidor SOCKS , ya que dichos servidores suelen ser de múltiples hosts. Se espera que el servidor SOCKS use DST.ADDR y DST.PORT, y la dirección de origen del lado del cliente y el puerto al evaluar la solicitud CONNECT . – Johnny

+0

¿El servidor o el proxy tienen alguna excepción? – CodingBarfield

41

En tierra UDP, una forma en que esto puede ocurrir es cuando envía un paquete UDP a un host, y el host remoto no tiene un escucha en ese puerto, y rebota un ICMP host como mensaje inalcanzable en respuesta.

http://support.microsoft.com/kb/263823/en-us

Esta excepción le dice que ningún proceso está escuchando en ese puerto.


Actualización: Usted debe ser capaz de evitar que el comportamiento con el siguiente código:

var udpClient = new UdpClient(); 
    uint IOC_IN = 0x80000000; 
    uint IOC_VENDOR = 0x18000000; 
    uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; 
    udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null); 
+0

Para mí, esto resolvió el problema de que Receive() causó una excepción después de que Send() enviara un datagrama a un socket sin listener. Podría enviar() muchos datagramas sin oyente sin errores, pero Receive() ya no funcionaría. Comportamiento de error muy vago. Esta solución es igualmente vaga, ¡pero ayudó mucho! +1 – Roland

+0

Tenía este error cuando los dispositivos en el campo cambiaban de repente las direcciones IP mientras los paquetes UDP estaban pendientes. Esto lo solucionó. – SteveGSD

Cuestiones relacionadas