远程主机强制关闭现有连接

Joh*_*nny 15 c# sockets asynchronous udp

我需要从异步套接字服务器获取UDP数据报,但我的应用程序中发生异常:

出现问题:

Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
Run Code Online (Sandbox Code Playgroud)

完整源代码:

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

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

例外:

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
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?


为了提供更多信息,我在这个页面上购买了私人袜子连接:http://rapidsocks.com/ 这个服务给我一个IP和端口列表谁真的不是代理..只是一个连接,给我一个代理IP :来自服务器上的池中的proxyPort响应...

如何从服务器上使用proxyIP:proxyPort获得答案?

Cam*_*ron 46

在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);
Run Code Online (Sandbox Code Playgroud)

微软文章263823就此主题发表了这样的话:[截至2019年很难找到]

症状在Windows 2000中,用户数据报协议(UDP)程序可能无法正常工作,并可能生成WSAECONNRESET响应.

原因如果使用sendto函数发送数据报导致"ICMP端口不可达"响应并且为readfds设置了select函数,则程序返回1,并且对recvfrom函数的后续调用不适用于WSAECONNRESET(10054)错误响应.在Microsoft Windows NT 4.0中,这种情况导致select函数阻塞或超时.

回到顶端提供反馈解决方案在Windows 2000中引入了名为"SIO_UDP_CONNRESET"的新套接字IOCTL.使用此IOCTL时,必须专门为Windows 2000重写该程序以获取原始Windows NT 4.0行为.Windows NT 4.0,Microsoft Windows 95和Microsoft Windows 98不支持此新IOCTL.除了重写您的应用程序,您还需要本文后面引用的修补程序.


Cod*_*eld 4

这确实是一条通用错误消息,可能意味着任何事情。是时候让低层网络流量嗅探器来过滤实际出现的问题了。在服务器上添加额外的错误处理 try catch 块并进行适当的日志记录始终是一个很好的起点。