UDPブロードキャストメッセージを送信するためのプログラムと、このブロードキャストをリッスンしているプログラムの2つのプログラムがあります。私の問題は、ブロードキャストを送信するときに、受信者が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();
}
}
厳密に言えば、IPネットワークでのパケットの複製はネットワークの動作として許可されており、今回何らかの形でそれを取り除く場合でも、ソフトウェアでそれを処理できる必要があります。あなたが特定のケースでなぜこれが起こるのか疑問に思っているだけなら...一見すると、あなたのコードに何の問題もありません。コンピューターのイーサネットポートに複数のIPアドレスがありますか? wireshark は、何が起こっているかについての詳細を得るのに役立つと思います。
UDPパケットは信頼できません。同じパケットを2回取得するか、まったく取得しない可能性があります。udpを使用する場合、データに何らかの種類の一意のIDを含める必要があるため、エラーを破棄したり、再送を要求したりできます。
(1)UDPパケットは同じルーター上のすべてのクライアントに対して非常に信頼性が高く、(2)サーバーからクライアントへのパスが複数ある場合にパケットの重複が発生する可能性があることに注意してください。
VMでこの問題が発生しましたが、仮想NICをVMに追加して実行しました] route delete」および「route add」コマンド。
具体的には(Windows 10 VMの場合)、新しい仮想NICが10.10.10.10の場合:ルート削除224.0.0.0マスク240.0.0.0ルート追加224.0.0.0マスク240.0.0.0 10.10.10.10
その理由は、ブロードキャストするときに、ネットワーク内のすべてのエンドポイントにメッセージを送信するためです。同じネットワークにいるため、ブロードキャストされているため同じメッセージを受信します。そのためのカスタムフィルターを作成できます。