40

2つのプログラムがあります。1つはUDPブロードキャストメッセージを送信するためのもので、もう1つはこのブロードキャストをリッスンするためのものです。私の問題は、ブロードキャストを送信すると、受信者が2つのメッセージを受信することがあるということです。なんで?

受信者コード:

public class Receiver {
  private readonly UdpClient udp = new UdpClient(15000);
  private void StartListening()
  {
    this.udp.BeginReceive(Receive, new object());
  }
  private void Receive(IAsyncResult ar)
  {
    IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000);
    byte[] bytes = udp.EndReceive(ar, ref ip);
    string message = Encoding.ASCII.GetString(bytes);
    StartListening();
  }
}

送信者コード:

public class Sender {
  public void Send() {
    UdpClient client = new UdpClient();
    IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000);
    byte[] bytes = Encoding.ASCII.GetBytes("Foo");
    client.Send(bytes, bytes.Length, ip);
    client.Close();
  }
}
4

4 に答える 4

33

厳密に言えば、IPネットワークでのパケットの複製はネットワークの動作を許可されており、今回はどういうわけかそれを取り除く場合でも、ソフトウェアでそれを処理できる必要があります。特定のケースでなぜこれが発生するのか疑問に思っている場合は、一見したところ、コードに問題はありません。コンピュータのイーサネットポートなどに複数のIPアドレスがありますか?Wiresharkは、何が起こっているのかについての詳細を取得するのに役立つと思います。

于 2012-05-31T11:39:43.647 に答える
6

UDPパケットは信頼できません。同じパケットを二度受け取るか、まったく受け取らない可能性があります。udpを使用する場合、エラーを破棄したり再送信を要求したりできるように、データに何らかの一意のIDを含める必要があります。

于 2012-05-31T11:43:31.437 に答える
1

その理由は、ブロードキャストするときに、ネットワーク内のすべてのエンドポイントにメッセージを送信するためです。あなたは同じネットワークにいるので、それが放送されるのであなたは同じメッセージを受け取るでしょう。そのためのカスタムフィルターを書くことができます。

于 2018-03-18T06:08:00.050 に答える
0

(1)UDPパケットは、同じルーター上のすべてのクライアントに対して非常に信頼性が高く、(2)サーバーからクライアントへのパスが複数ある場合、パケットの重複が発生する可能性があることに注意してください。

私はVMでこの問題を抱えていましたが、仮想NICをVMに追加し、「routedelete」コマンドと「routeadd」コマンドを実行させた私よりも賢いネットワークの第一人者によって解決されました。

具体的には(Windows 10 VMの場合)、新しい仮想NICが10.10.10.10の場合:route delete 224.0.0.0 mask 240.0.0.0 route add 224.0.0.0 mask 240.0.0.0 10.10.10.10

于 2019-03-09T04:01:02.877 に答える