Как правильно настроить UdpClient для прослушивания многоадресного адреса 239.255.255.250:1900 в С#

Я настраиваю небольшую локальную сеть с 3 ноутбуками. Моя цель — поэкспериментировать с протоколом UpNP и заставить ноутбуки обнаруживать друг друга с помощью UpNP. Для этого они должны иметь возможность прослушивать уведомления друг от друга. Согласно протоколу, эти уведомления отправляются на многоадресный адрес 239.255.255.250:1900. Однако у меня возникла проблема с настройкой ноутбуков для прослушивания этого адреса. Я начинаю использовать только 1 шт. IP-адрес моего ПК 10.0.0.5.

Однако, когда я пытаюсь настроить UdpClient для прослушивания 239.255.255.250:1900, я получаю сообщение об ошибке: «Запрошенный адрес недействителен в своем контексте».

Я попытался просто настроить его, используя это:

IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);
UdpClient client = new UdpClient(endpoint);
client.BeginReceive(MessageReceived, null);

Я также пробовал:

UdpClient client = new UdpClient(Port);
client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));
client.BeginReceive(MessageReceived, null);

Но я все равно получаю ту же ошибку: «Запрошенный адрес недействителен в своем контексте».

Как правильно настроить UdpClient для прослушивания многоадресного адреса 239.255.255.250:1900?

Спасибо за вашу помощь!!!


person Curtis    schedule 02.01.2013    source источник


Ответы (1)


Хорошо, после долгих поисков и ударов головой о стол у меня все заработало. Я думал, что вчера он работал, но он работал только в Windows 7, а не в XP.

Итак, вот оно:

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port);

UdpClient client = new UdpClient();
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Client.Bind(localEndPoint);
client.JoinMulticastGroup(IPAddress);
client.MulticastLoopback = true;

Client.BeginReceive(MessageReceived, null);

Я бы хотел, чтобы это было задокументировано немного лучше, но я думаю, именно поэтому мы получаем большие деньги $$$.

Спасибо StackOverflow за предоставление такой УДИВИТЕЛЬНОЙ базы знаний, из которой можно извлечь этот материал!

person Curtis    schedule 02.01.2013
comment
ПРИМЕЧАНИЕ. Оператор Bind не может стоять перед оператором SetSocketOption. Это нужно после. Или вы получаете исключения. - person Curtis; 08.01.2013
comment
Пожалуйста, укажите значения Port и IPAddress. Для дальнейшего использования: stackoverflow.com/a/35799184/4454665 помог мне - person SWdV; 28.12.2018
comment
Порт == 1900. IP-адрес == IP-адрес.Parse(239.255.255.250) - person Curtis; 31.12.2018