0

指定された複数のインターフェイスで upnp パケットを送信およびリッスンするサーバー アプリケーションを作成しました (ただし、ネットワーク カードが 1 つしかない場合、問題はすでに存在していました)。コードは簡単で非常に単純ですが、非常に奇妙な動作に直面しています。

アプリケーションがリッスンしてメッセージを送信する必要があるエンドポイント (インターフェイスの IP アドレス) のリストがあり、次のコードを使用してそれぞれの UdpClient を作成します。

private UdpClient c;
private IPEndPoint ep;
public MyClass(IPAddress ip)
{
    ep = new IPEndPoint(ip, 1900);
    c = new UdpClient(ep);
    c.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));
    c.BeginReceive(onReceive, null);
}

毎分パケットを送信しますが、問題なく動作します

byte[] msg = System.Text.Encoding.ASCII.GetBytes(discoverMessage);
c.Send(msg, msg.Length, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));

クライアントはこれに応答し、受信関数が呼び出されます。

 protected void onReceive(IAsyncResult r)
 {
     IPEndPoint rep = new IPEndPoint(IPAddress.Any, 0);
     string msg = Encoding.ASCII.GetString(c.EndReceive(r, ref rep));
     <-- do other things -->
     c.BeginReceive(onReceive, null);
 }

しかし、ときどきパケットをまったく受信しません。つまり、パケットは確実に受信されますが、受信機能がまったく起動されません (wireshark でパケットを確認でき、クライアントがパケットをネットワークに送信したことがわかります)。

これを解決するための「回避策」は、アプリケーションを再起動し、インターフェイスを無効/有効にし、(ゲスト)マシンを再起動し、エンドポイント リストを変更することです(たとえば、0.0.0.0 を含める)-正直なところ、解決策/回避策は見つかりませんでしたしかし、これを組み合わせると問題が解決するようです。再び機能するようになったら、古い構成をコピーして元に戻すことができ、すべてが以前と同じように機能します(したがって、構成は問題ありませんでした)。

Windows Server 2012 で .NET 4.5 を使用しており、Windows 8 の Hyper-V ゲストで実行されています。2 つの仮想ネットワーク カードを備えた ATM で、1 つは管理用に内部接続され、ホストと共有されていない物理ネットワーク カードに接続されています。クライアントネットワークに接続されています。

誰かが同様の問題を経験しましたか? Wireshark または winpcap を使用して問題を追跡しているときに問題が発生することがあると考えていました。それとも、Hyper-V 仮想ネットワーク カードに問題があるのでしょうか? または、私が好むのは、コードで何か間違ったことをしているのですか?

4

2 に答える 2

0

UDP は「損失の多い」プロトコルであることを意図しています。 ここ を参照してください。信頼性が必要な場合は、エラー制御を実装するか、組み込みの TCP/IP に切り替える必要があります。

于 2013-04-27T22:07:34.143 に答える
0

複数の NIC がある場合、igmp 参加要求はどのネットワークに送信されますか?

JoinMulticastGroup メソッドの 2 つのパラメータ バージョンを使用して、マルチキャスト トラフィックを検索する特定のローカル インターフェイス IP アドレスを含めることができます。これは、マシンに複数の物理 NIC があり、複数のネットワークへのアクセスを提供するシナリオに特に関連します。

于 2013-05-15T03:11:17.477 に答える