0

クライアントからのリクエストを受け取り、レスポンスを返すソケット サーバー (C++ で記述) があります。したがって、私のテスト クライアント アプリケーション (C#) は非常に単純です。

        try {
            UdpClient udpClient = new UdpClient(10241);

            // Connect
            udpClient.Connect(server_ip_address,  10240);

            // prepare the packet to send
            iWritableBuff wbuff = new iWritableBuff();
            [ ... ]

            // Send 
            udpClient.Send(wbuff.GetBuff(), (int)wbuff.Written());

            // Receive a response
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 
            Console.WriteLine("We've got some data from the server!!! " + receiveBytes.Length + " bytes.");

            udpClient.Close();
        } catch (Exception e) {
            Console.WriteLine("ERROR: " + e.ToString());
        }

両方のアプリケーションを同じコンピューターで実行しています。サーバーはクライアント ポート 10241 からポート 10240 への要求を受信し、クライアント ポート 10241 に応答を返しますが、クライアントはそれを受信しません。したがって、すべてが C++ クライアントで完全に機能するため、サーバーがパケットを送り返すと確信しています。これは、C# クライアントで何か間違ったことをしているということです。何か案が?

ありがとう!

PS> Berkley Socket C# クライアントでテストするだけです:

        try {
            // Create socket
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            // Bind
            IPEndPoint myEP = new IPEndPoint(IPAddress.Any, 0);
            s.Bind(myEP);

            // prepare the packet to send
            iWritableBuff wbuff = new iWritableBuff();
            [ ... ]

            // Send it
            IPEndPoint sEP = new IPEndPoint(IPAddress.Parse(server_ip_address), 10240);
            int res = s.SendTo(wbuff.GetBuff(), (int)wbuff.Written(), 0, sEP);

            // Receive the response
            byte[] receiveBytes = new Byte[1024];
            EndPoint recEP = new IPEndPoint(IPAddress.Any, 0);
            res = s.ReceiveFrom(receiveBytes, ref recEP);
            Console.WriteLine("We've got some data from the server!!! " + res + " bytes.");
        } catch (Exception e) {
            Console.WriteLine("ERROR: " + e.ToString());
        }

そして、それは完璧に機能します!UdpSocket の何が問題になっていますか?

4

1 に答える 1

1

これが、パケットをブロードキャストせずに指定されたアドレスに送信するだけの UDPClient に当てはまるかどうかはわかりませんが、同様の障害に遭遇しました。

ネットワーク上のいくつかのカスタム マシンを検出するために udp パケットをブロードキャストする UDPClient がありました。サーバーが単純にエコー バックするというメッセージを受信しようとすると、情報が受信されず、タイムアウトになります。メッセージをブロードキャストする UDPClient を使用すると、メッセージを受信できないことが判明しました。幸運にも私が見つけた msdn のフォーラム トピックを除いて、どこにも文書化されていません。

解決策は、メッセージを送信し、すぐにソケットを閉じ、同じポートで新しい UDPClient を開き、この新しい UDPClient を使用して、エコー バックされた UDP パケットを受信することでした。とてもうるさい。

それを試してみて、それが機能するかどうかを確認してください。ブロードキャストされたパケットの送信には間違いなく機能します。

于 2013-05-30T16:09:41.823 に答える