1

私は現在、WiFi経由でリモート組み込みシステムと通信することになっているWindowsアプリケーションに取り組んでいます。Windows アプリケーションは、リモート ユニットが受信し、送信者 IP を抽出するブロードキャスト メッセージを送信しています。次に、リモート ユニットは、抽出された IP に応答を返します。問題は、ブロードキャスト メッセージを送信するときに C# がワイヤレス ネットワーク接続を使用していることですが、Socket を開いて応答をリッスンする (または指定されたアドレスにメッセージを送信する) ときに、ローカル エリア接続を使用していることです。これらのインターフェイスには異なる IP アドレスがあるため、Windows アプリケーションはリモートからの応答を受け取りません。

私の質問は、C# が異なるソケットに対して異なるネットワーク インターフェイスを使用するのはなぜですか? プログラムがすべてのソケットに対して同じインターフェイスを使用するように強制する方法はありますか?

ブロードキャストメッセージを送信するためのコードは次のとおりです

    sockB = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);    //Create a UDP socket
    sockB.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);        //Enable broadcast on socket
    IPEndPoint briep = new IPEndPoint(IPAddress.Broadcast, 9584);                            //Relate a port to the broadcast address    
    byte[] dat = { 0xAD, 0xEE, BRDCST_CMND, (byte)(0xAD ^ 0xEE ^ BRDCST_CMND) };           //Put in buffer
    sockB.SendTo(dat, briep);              //Broadcast data

これがリモコンからの回答を聞くためのコードです

    sockC = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                 //Create an udp socket
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1);                 //set timeout to 5 ms
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1);
    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9999);             //set up an "any" ip address and associate it with port 9854        
    EndPoint ep = (EndPoint)(iep);                                      //Make an endpoint out of previous association
    sockC.Bind(iep);                             //Bind the created socket to listen on port 9854
    byteRecv = sockC.ReceiveFrom(data, ref ep);                  //Receive on socke

ありがとうございました!

4

1 に答える 1

0

ワイヤレス アダプターで強制的に受信する場合は、ワイヤレス アダプターを参照するより具体的な IPEndPoint を設定します。

IPEndPoint iep = new IPEndPoint(IPAddress.Parse("wireless adapter IP here"), 9999);

IPAddress.Any 私の知る限り、最も優先度の高いものを選択するだけでなく、すべてのインターフェイスでリッスンする必要があるため、ワイヤレスアダプターでセットアップした方法で応答パケットを取得する必要があります上記のコードを使用して強制的に実行できると思いますが、それでもうまくいかない場合は、応答の UDP メッセージがどこかに飲み込まれている可能性があります。

ブロードキャストメッセージを送信する前に、ソケットが応答をリッスンするように設定してください。そうしないと、リスナーが設定される前に応答が実際に来るという競合状態が発生する可能性があります。

于 2012-10-22T17:11:43.720 に答える