Существующее соединение было принудительно закрыто удаленным хостом - PullRequest
15 голосов
/ 26 августа 2011

Мне нужно получить дейтаграмму 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 и портов, которые на самом деле не являются прокси ... просто соединение, которое дает мне прокси IP: proxyPort из пула на сервере в ответ ...

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

Ответы [ 2 ]

44 голосов
/ 20 сентября 2011

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

Говоря простым языком, это исключение говорит вам о том, что ни один процесс не слушает на дальнем конце этого порта.


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

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

В статье 263823 Microsoft говорится об этом по теме: [трудно найти по состоянию на 2019 г.]

СИМПТОМЫ В Windows 2000 программа протокола дейтаграмм пользователя (UDP) может неработать и может генерировать ответ WSAECONNRESET.

ПРИЧИНА Если отправка дейтаграммы с использованием функции sendto приводит к ответу «ICMP port unreachable» и функция select установлена ​​для readfds, программа возвращает 1 и последующий вызовфункция recvfrom не работает с ошибочным ответом WSAECONNRESET (10054).В Microsoft Windows NT 4.0 эта ситуация приводит к блокировке или отключению функции выбора.

РАЗРЕШЕНИЕ В Windows 2000 был представлен новый сокет IOCTL с именем «SIO_UDP_CONNRESET». При использовании этого IOCTL программа должна бытьпереписан специально для Windows 2000, чтобы получить оригинальное поведение Windows NT 4.0.Windows NT 4.0, Microsoft Windows 95 и Microsoft Windows 98 не поддерживают этот новый IOCTL.В дополнение к переписыванию приложения вам понадобится исправление, на которое есть ссылки в этой статье.

3 голосов
/ 26 августа 2011

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

...