ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
5 июля
1528014
AlexBi (03.07.2025 12:47, просмотров: 65)
Прошу помощи в понимании работы LWIP и UDP, а так же работы сокетов в windows. Система простая, есть компьютер с windows и устройство с контроллером на котором работает LWIP, все в одной локальной сети. Сейчас надо с компьютера послать широковещательный UDP пакет, а контроллер его должен принять. Уже на этом этапе у меня какие-то странности. 

Странность первая. На компьютере написана простейшая консольная программа, которая используя Winsock должна отправить UDP пакет. Сокет на компьютере запускается, опция широковещания (SO_BROADCAST) устанавливается, отправка через sendto проходит без ошибок, адрес получателя inet_addr("255.255.255.255") но Wireshark на том же компьютере ни чего не видит, где этот пакет теряется не понятно, в бандмауэре работа моей программы разрешена. Для обхода этой проблемы пришлось использовать локальный широковещательный адрес, для моей сети это "192.168.0.255", при таком адресе получателя пакет отправляется, т.е. Wireshark его показывает, хоть и не идентифицирует как широковещательный, хотя в Ethernet-заголовке адрес из FF, т.е. широковещательный. Другие широковещательные пакеты на адрес 255.255.255.255 Wireshark показывает.

Странность вторая. При отправке с компьютера используется sendto, которое в качестве порта отправки берет первый свободный номер. Порт получателя у меня фиксированный. В программе на контроллере у меня прием настроен так: conn = netconn_new(NETCONN_UDP); netconn_bind(conn, IP_ADDR_ANY, UDP_PORT); Однако приема UDP нет. Прием UDP пакета появляется только если я сделаю так, что бы на компьютере номер порта отправки стал таким же как номер порта получателя, тогда прием широковещательных пакетов начинает работать. Почему так мне не понятно.

Вроде бы не делаю ни чего хитрого, а получаю странный результат.