Подтвердить что ты не робот

Отправка широковещательной рассылки UDP, прием нескольких сообщений

У меня есть 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();
  }
}
4b9b3361

Ответ 1

Строго говоря, дублирование пакетов в IP-сети допускает поведение сети, и вы должны иметь возможность иметь дело с ней в своем программном обеспечении, даже если вы как-то избавитесь от нее на этот раз. Если вам просто интересно, почему это происходит в вашем конкретном случае... на первый взгляд я не вижу ничего плохого в вашем коде. У вас несколько IP-адресов на Ethernet-порту вашего компьютера или на некоторых таких? Я думаю, wireshark может помочь получить более подробную информацию о том, что происходит.

Ответ 2

UDP-пакеты не надежны, вполне возможно, что вы получите один и тот же пакет два раза или даже вообще ничего, при использовании udp вам нужно указать какой-то уникальный идентификатор в своих данных, чтобы вы могли отбросить ошибки или запрос повторно отправить.