Проблема с кодом сокета состоит в том, что «recvfrom» даст вам только адрес источника, с которого пакет был отправлен. Он не сообщает вам IP-адрес того, куда был отправлен пакет. Вы хотите иметь возможность проверять адрес назначения UDP-пакета, чтобы можно было отфильтровывать пакеты, отправленные на IP-адреса многоадресной рассылки, которые вас не интересуют.
Существует опция сокета, которую вы можете установить, а затем использовать recvmsg вместо recv или recvfrom для получения IP-адреса назначения, на который был отправлен пакет.
1) Используйте setsockopt с IP_PKTINFO, чтобы включить получение IP-адреса назначения, переданного на уровень приложения для данных, полученных в сокете.
int enable = 1;
setsockopt(sock, IPPROTO_IP , IP_PKTINFO , &enable, sizeof(enable));
2) Используйте recvmsg вместо recvfrom (или recv), чтобы получить адрес назначения, на который был отправлен пакет UDP. У меня есть вспомогательная функция с именем "recvfromex", которая оборачивает recvmsg и отражает функциональность recvfrom - ожидайте, что у нее есть дополнительный параметр для вызывающей стороны, чтобы получить IP-адрес назначения пакета.
Это немного ветрено, но вы можете посмотреть на мой код C ++ из моего проекта на github и взять то, что вам нужно.
Посмотрите на функцию recvfromex здесь
Больше примеров кода для вызова setsockopt здесь (обратитесь к функции "EnablePktInfo", чтобы узнать, как использовать вызов setsockopt с IP_PKTINFO). Также содержит расширения для IPV6 и BSD.