web-dev-qa-db-ja.com

既存の接続がリモートホストによって強制的に閉じられました

非同期ソケットサーバーから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でその回答を取得するにはどうすればよいですか?

16
Johnny

これは実際には、何を意味する可能性がある一般的なエラーメッセージです。低レベルのネットワークトラフィックスニファに、実際に問題のある部分をフィルタリングさせる時間。適切なロギングを備えたサーバーで、追加のエラー処理try catchブロックを追加することは、常に開始するのに最適な場所です。

4
CodingBarfield

UDPランドでは、これが発生する1つの方法は、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);

Microsoftの記事263823はこの件について次のように述べています:[2019年の時点で見つけるのは難しい]

現象Windows 2000では、ユーザーデータグラムプロトコル(UDP)プログラムが機能せず、WSAECONNRESET応答を生成する場合があります。

原因sendto関数を使用してデータグラムを送信すると「ICMPポート到達不能」応答が発生し、selectfdsがreadfdsに設定されている場合、プログラムは1を返し、後続のrecvfrom関数の呼び出しはWSAECONNRESET(10054)エラー応答で機能しません。 。 Microsoft Windows NT 4.0では、この状況により、select関数がブロックまたはタイムアウトします。

解決方法「SIO_UDP_CONNRESET」と呼ばれる新しいソケットIOCTLがWindows 2000に導入されました。このIOCTLを使用する場合、元のWindows NT 4.0の動作を取得するには、プログラムをWindows 2000専用に書き直す必要があります。 Windows NT 4.0、Microsoft Windows 95、およびMicrosoft Windows 98では、この新しいIOCTLはサポートされていません。アプリケーションを書き換えるだけでなく、この記事の後半で参照されている修正プログラムも必要です。

46
Cameron