1

ワイヤレス メッシュ用のプログラムを作成しようとしています (名前以外はアドホックです)。ほとんどのネットワークは TCP メッセージングを処理しますが、すべての近隣 IP を特定するために (起動時に不明になるため)、最初の検出メッセージに UDP ブロードキャストを使用することにしました。そのコードは、ほとんどの場合、最初のテストが機能しているように見えたため、無関係であり、現在は呼び出していません。

以下は、ネイバーの IP を受信して​​登録するセクションです。

protected override void ReceiveMessageUDP()
    {
        while (live)
        {
            try
            {
                UdpListener = new UdpClient(_PORTRECEIVE);
                UdpListener.EnableBroadcast = true;
                Socket socket = UdpListener.Client;
                IPEndPoint endPoint1 = new IPEndPoint(IPAddress.Loopback, _PORTRECEIVE);
                IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
                socket.Bind(endPoint2);
                socket.Listen(25);
                Socket connected = socket.Accept();
                byte[] buffer = new byte[1024];
                int length = connected.Receive(buffer);

                IPAddress remoteIP = ((IPEndPoint)connected.RemoteEndPoint).Address;
                if (!ipAddresses.Contains(remoteIP))
                    ipAddresses.Add(remoteIP);

                Message.Add(Encoding.ASCII.GetString(buffer, 0, length));
            }
            catch (SocketException e) { Console.WriteLine(e.ErrorCode); }
            catch (Exception) { }
        }
    }

両方の IPEndPoints でテストしましたが、設定方法に関係なく、Bind は SocketException.ErrorCode 10022 Windows Socket Error Codesで失敗します。これは無効な引数ですが、必要な引数が EndPoint であるため、それが何を意味するのか混乱しています。

これは最初の実行で失敗するため、ポートを再バインドしようとしているわけではありません。

4

2 に答える 2

1

UdpCLientポートを作成したときに、ポートは既に にバインドされています。その後、同じポートを別の にバインドすることはできませんIPEndPoint

UdpListener = new UdpClient(_PORTRECEIVE);  // binds port to UDP client
...
IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
socket.Bind(endPoint2);  // attempts to bind same port to end point

このようにしたい場合は、 をビルドしてバインドしてから、ポートの代わりにそれを使用して をIPEndPoint構築します。UdpClient

IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
socket.Bind(endPoint2);  // bind port to end point

UdpListener = new UdpClient(endPoint2);  // binds port to UDP client via endpoint

endPoint1同じポートに別のエンドポイントも設定している理由がわかりません。これを使用しようとすると、後で問題が発生する可能性があります。

于 2010-11-09T23:32:55.183 に答える