0

複数のマシンで動作する C# アプリがありますが、何らかの理由で別のマシンでは動作しません。すべて Windows XP です。

ポートを開いてリッスンするだけです。

void Open() 
{
var myIpAddress = UdpComm.GetPcIpAddress(target);

listenEndPoint = new IPEndPoint(myIpAddress, RemotePort);

System.Windows.Forms.MessageBox.Show("Creating listener: " + target.ToString() + " - " + listenEndPoint.ToString());
_client = new UdpClient(listenEndPoint);
_client.EnableBroadcast = true;
_client.BeginReceive(ReceiveCallback, null);
}

public void ReceiveCallback(IAsyncResult ar)
{
  System.Windows.Forms.MessageBox.Show("Data received");
}

プログラムを実行すると、Open メソッドが正常に実行され、アドレスとポートが正しいことがわかります。

Wireshark でこれを見ると、データがリモート アドレスから正しく送信されていることもわかりますが、コールバックからのメッセージ ボックスは表示されません。

エラーがスローされることはありません。データが Wireshark に表示され、アプリには表示されない原因について何か考えはありますか?

4

3 に答える 3

2

NIC のサブネット マスクを 255.255.252.0 ではなく 255.255.255.0 に変更すると、コールバックが呼び出され始めました。

なぜwiresharkがトラフィックを認識できたのにUdpClientを認識できなかったのかはわかりませんが、その変更が違いを生んだようです.

于 2011-09-20T20:46:03.070 に答える
2

Wireshark はすべてをキャプチャしますが、アプリケーションはフィルタリング後に取得したもののみを取得します。
問題は送信側にある可能性があります。本質的に、サブネットマスクは、アドレスのどの部分がネットワークとどのノードを定義するかを定義します。したがって、サブネット マスクが 255.255.252.0 の場合、ネットワーク アドレスは 22 ビット長になります。
クライアントが 10.0.16.100\22 にあるとします。ブロードキャストの目的で、可能な限り高いアドレスを持つノード アドレスが予約されています。多くのアプリケーションは、ネットマスクの長さが 24 ビット (255.255.255.0) であることを想定しており、10.0.16.255 にブロードキャストします。最後の 8 ビットのみが設定されているため、これは間違っています。このようなサブネットの適切なブロードキャスト アドレスは 10.0.19.255 です。

于 2011-11-30T16:10:19.130 に答える
0

着信データをキャプチャするには、非同期受信プロセスを終了する必要があります。_client.BeginReceive() を呼び出すと、着信データを受け取るスレッドが生成されます。このデータをキャプチャするには、以下のコードを ReceiveCallback に追加する必要があります。その後、必要に応じて着信 byte[] を使用できるようになります。

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint);

さらに、次のリンクで MSDN の UdpClient クラスを参照できます。

http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.endreceive.aspx

于 2011-09-20T00:40:01.467 に答える