Как привязать к широковещательному адресу в Micrium
Я пытаюсь найти способ привязать сокет IPv4 UDP к широковещательному адресу в Micrium (µC/OS-Ⅲ).
Попытка привязать сокет к фактическому широковещательному адресу просто возвращает NET_SOCK_ERR_INVALID_ADDR
, Трансляция прямо не упоминается в списке вещей, которые необходимо связать с NetSock_Bind
вызов документации, аналога нет SO_BROADCAST
или. Это вообще невозможно?
Могу ли я в качестве крайней меры добавить широковещательный адрес к существующему интерфейсу в качестве его собственного адреса (это не должно мешать ARP, так как никто не собирается его запрашивать, и я не собираюсь ничего через него отправлять)?
1 ответ
Посмотрите документацию micrium. Следуйте инструкциям, и вы не получите ошибки.
Кстати, если вы не будете использовать NetApp_SetSockAddr
и попробуйте связать с помощью NetSock_Bind
, вы получите NET_SOCK_ERR_INVALID_ADDR
что случилось с тобой.
Редактировать:
посмотрите на следующий код, который работает для меня. Обратите внимание, что IP-адрес я вручную инициализировал адрес хоста и использовал определенный адрес NET_SOCK_ADDR_IP_V4_WILDCARD
,
NET_SOCK_ADDR_IPv4 host;
NET_ERR perr;
Mem_Clr(&host, sizeof(host));
host.AddrFamily = NET_SOCK_ADDR_FAMILY_IP_V4;
host.Addr = NET_UTIL_HOST_TO_NET_32(NET_SOCK_ADDR_IP_V4_WILDCARD);
host.Port = NET_UTIL_HOST_TO_NET_16(socketPort);
netSockId = NetSock_Open( NET_SOCK_PROTOCOL_FAMILY_IP_V4,
NET_SOCK_TYPE_DATAGRAM,
NET_SOCK_PROTOCOL_UDP,
&perr);
if (perr != NET_SOCK_ERR_NONE)
{
// log the error.
return;
}
NetSock_Bind( netSockId,
(NET_SOCK_ADDR*)&host,
NET_SOCK_ADDR_SIZE,
&perr);
if (perr != NET_SOCK_ERR_NONE)
{
// log the error.
return;
}
Что я сказал о NetApp_SetSockAddr()
Функция заключается в том, что если я вызываю его вместо ручной инициализации хоста, он возвращает полученную ошибку.