Получение широковещательного сообщения UDP в C #

Я знаю, что этот вопрос задавали много раз. Я прочитал ВСЕ ответы и попробовал КАЖДЫЙ фрагмент кода, который смог найти. Через несколько дней я настолько отчаялся, что вынужден просить вас о помощи.

У меня есть устройство и компьютер в моей домашней сети. Устройство отправляет широковещательные сообщения UDP. На моем ПК я вижу эти сообщения в wirehark:

Исходная конечная длина

192.168.1.102 0.0.0.0 UDP 60 Порт источника: 9050 Порт назначения: 0

Это означает, что пакеты прибывают на мой компьютер. Следующим шагом было создание приложения C #, которое принимает эти пакеты. Как упоминалось выше, я пробовал все возможные решения, но ничего не получил.

Так что я думаю, должно быть что-то очень простое, что я делаю неправильно. Может кто-нибудь мне помочь? Спасибо!


person Boris    schedule 25.09.2012    source источник
comment
Можете ли вы опубликовать код, который вы используете для прослушивания пакетов?   -  person Tomas McGuinness    schedule 25.09.2012
comment
Я пробовал код из: codeidol.com/csharp/csharp -network / IP-Multicasting / и java2s.com/Code/ CSharp / Network / ReceiveBroadcast.htm, а также stackoverflow.com/questions/746519/   -  person Boris    schedule 25.09.2012
comment
какой-нибудь активный файрволл? Я не уверен, где Wireshark перехватывает пакеты, но возможно, что брандмауэр потом их остановит   -  person Default    schedule 26.09.2012
comment
Нет, я использую только брандмауэр Windows. И это было закрыто до того, как я начал тестирование.   -  person Boris    schedule 26.09.2012


Ответы (2)


Просто столкнулся с той же проблемой и хотел рассказать, что исправило для меня.

Вкратце: похоже, что брандмауэр Windows каким-то образом был причиной такого странного поведения, и простое отключение службы не помогает. Вы должны явно разрешить входящие UDP-пакеты для конкретной программы (исполняемого файла) в списке входящих правил брандмауэра Windows.

Полное описание случая читайте далее.

Моя сетевая настройка: IP-адрес моей (принимающей) машины - 192.168.1.2, IP-адрес отправляющей машины - 192.168.1.50, а маска подсети на обеих машинах - 255.255.255.0. Моя машина работает под управлением Windows 7 x64.

Это код (примерно), который я использовал:

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
sock.Bind(iep);
sock.EnableBroadcast = true;
EndPoint ep = (EndPoint)iep;
byte[] buffer = new byte[1000];
sock.ReceiveFrom(buffer, ref ep);

Первоначально это не сработало, если я не отправил широковещательный пакет из этого сокета до того, как я позвоню на него ReceiveFrom. Т.е. добавив эту строку перед ReceiveFrom вызовом:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort))

Когда я не отправлял широковещательный пакет первым из принимающего сокета, входящие широковещательные пакеты не принимались им, даже если они появлялись в Wireshark (адресатом пакетов было 255.255.255.255).

Я подумал, что похоже, что брандмауэр возится с входящими пакетами (если только исходящим пакетом не открывается какое-то отверстие UDP - хотя я раньше не слышал, что пробивка отверстий UDP каким-то образом применяется к широковещательным пакетам), поэтому Я пошел в службы и вообще отключил службу брандмауэра Windows. Это ничего не изменило.

Однако, попробовав все остальное, я снова включил службу брандмауэра и снова попытался запустить программу. На этот раз появилось приглашение брандмауэра с вопросом, хочу ли я разрешить процесс MyProgram.vshost.exe (я отлаживал в Visual Studio) через брандмауэр, я принял его и вуаля - все сработало! Входящие пакеты сейчас принимались!

person lxa    schedule 05.03.2014

Вы в порядке, в коде есть что-то, что вызывает проблему. (Я не читал статью, просто скопировал вставку)

Он всегда работает с локальной машины, но с удаленной машины по какой-то причине не работает.

Чтобы исправить это: в Broadcst.cs транслируются дважды. один раз для локального хоста, а затем для целевого IP-адреса (iep2). просто удалите

sock.SendTo(data, iep1);  

и он должен работать.

Понятия не имею почему.

person Slime recipe    schedule 27.09.2012