Существующее соединение было принудительно закрыто удаленным хостом
Мне нужно получить UDP-датаграмму с асинхронного Socket-сервера, но в моем приложении было исключение:
Проблема появляется там:
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 с сервера?
Ответы
Ответ 1
Это действительно общее сообщение об ошибке, которое может означать что угодно. Время, чтобы получить сниженный уровень сетевого трафика, чтобы фильтровать то, что на самом деле происходит неправильно. Добавление дополнительной обработки ошибок пытается захватить блоки на сервере с приличным протоколированием - всегда отличное место для запуска.
Ответ 2
В области UDP один из способов может произойти, когда вы отправляете UDP-пакет на хост, а удаленный узел не имеет прослушивателя на этом порту и отказывается от сообщения ICMP-хоста в ответ.
http://support.microsoft.com/kb/263823/en-us
Это исключение указывает, что ни один процесс не прослушивает этот порт.
Обновление: вы можете избежать этого поведения с помощью следующего кода:
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);