2011-08-26 4 views
14

мне нужно, чтобы получить UDP датаграммы от асинхронного сокета сервера, но исключение произошло в моем приложении:Существующее соединение было принудительно закрыто удаленным узлом

Проблема появляется там:

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

Полный исходный код :

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

      } 
     } 
    } 

Исключение:

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 

В чем может быть проблема?


Чтобы предоставить больше информации, я купил соединение частных носков на этой странице: http://rapidsocks.com/ это услуги дают мне список IP и порт, который в действительности не является прокси .. только соединение, которое даст мне proxyIP: proxyPort из пула на сервере в ответ ...

Как получить этот ответ с proxyIP: proxyPort с сервера?

+0

хороший вопрос - может быть, если бы вы рассказать нам немного больше - где брошено исключение? Вы видите какие-либо ваши «отладочные сообщения» на консоли? Можете ли вы показать нам пробный прогон? – Carsten

+0

Проведите печать stackTrace в блоке catch и посмотрите, какая строка генерирует исключение. – Zenwalker

+0

* другая сторона * работает правильно - не так ли? Вы можете это проверить? – Carsten

ответ

3

Это действительно общее сообщение об ошибке, которое может означать что угодно. Время, чтобы получить сниженный уровень сетевого трафика, чтобы фильтровать то, что на самом деле происходит неправильно. Добавление дополнительной обработки ошибок пытается захватить блоки на сервере с приличным протоколированием - всегда отличное место для запуска.

+0

i'ts сервер с прокси-сервисами, это конфиденциально и любая информация о том, как получить IP: порт на внутренней записи записывается в rfc1928 – Johnny

+0

CONNECT В ответе на CONNECT BND.PORT содержит номер порта, который назначается серверу для подключения к целевому хосту, а BND.ADDR содержит соответствующий IP-адрес.В поставляемом BND.ADDR часто бывает , отличающемся от IP-адреса, который клиент использует для доступа к серверу SOCKS , поскольку такие серверы часто многожильные. Ожидается, что , что сервер SOCKS будет использовать DST.ADDR и DST.PORT, а также адрес и порт источника на стороне клиентапри оценке запроса CONNECT . – Johnny

+0

Имеются ли у сервера или прокси какие-либо исключения? – CodingBarfield

41

В зоне UDP один из способов, которым это может произойти, - это когда вы отправляете UDP-пакет на хост, а удаленный узел не имеет прослушивателя на этом порту и отбрасывает сообщение об ошибке ICMP-хоста в ответ.

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

Это исключение говорит вам, что ни один процесс не слушает этот порт.


Update: Вы должны быть в состоянии избежать такого поведения со следующим кодом:

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

Для меня это решило проблему, по которой Receive() вызвало исключение после отправки() отправленной дейтаграммы в сокет без прослушивателя. Я мог бы Отправить() много дейтаграмм без прослушивателя без ошибок, но Receive() не будет работать больше. Очень расплывчатое поведение ошибки. Это решение одинаково расплывчато, но оно очень помогло! +1 – Roland

+0

Была ли эта ошибка, когда устройства в этом поле внезапно меняли IP-адреса, в то время как UDP-пакеты были выдающимися. Это фиксировало это. – SteveGSD

Смежные вопросы