Как многоадресно (отправить) на первый сетевой адаптер? - PullRequest
3 голосов
/ 07 октября 2011

Недавно я обнаружил, что если у меня есть подключение удаленного доступа (это для киоска) и подключение к локальной сети, то при установлении подключения удаленного доступа (с доступом в Интернет) мое многоадресное sendto по умолчанию будеткоммутируемый, а не моя сетевая карта.Это заставило многоадресную рассылку подключаться к коммутируемому соединению, а не к моей локальной сети, которая имеет несколько подписчиков многоадресной рассылки.

Я понимаю, что мне нужно использовать IP_MULTICAST_IF, чтобы установить интерфейс на сокете многоадресной рассылки.Вопрос в том, как мне перечислить интерфейсы и как использовать IP_MULTICAST_IF в setsockopt?В киоске Windows XP Embedded всегда будет только один сетевой адаптер для локальной сети.Как получить этот интерфейс и передать его IP-адрес (это то, что ожидает IP_MULTICAST_IF ??) в setsockopt?

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

Видимо setsockopt и IP_MULTICAST_IF не работают, если вместо ws2_32.dll используется wsock32.dll.Я думал, что делал это неправильно, когда продолжал получать 1.0.0.0 в качестве IP-адреса, даже когда это было что-то еще, что я установил с помощью setsockopt.Забавно, что перед вызовом IP_MULTICAST_IF он вернул бы 0.0.0.0, так что setsockopt` что-то изменил, но не правильно.

Кто-то еще, у которого была такая же проблема еще в 2004 году - http://us.generation -nt.com / IP многоадресной проблемно-помощь-37595922.html .Когда мы #include "winsock2.h" нам нужно использовать ws2_32.dll.Однако в C ++ Builder невозможно использовать ws2_32.dll, когда мы используем winsock2.h - RTL неявно ссылается на wsock32.dll, и вы не можете связать ws2_32.dll, даже если вы явно указали #pragma comment(lib, "ws2_32.lib").Embarcadero действительно нужно исправить это!Кто-то из команды RTL, должно быть, решил, что умный неявно включает wsock32.dll.Единственное, что он сделал 'умный' , это то, что пользователям не нужно было включать в свой код одну строку - #pragma comment(lib, "wsock32.lib").Несмотря на это, они также могут включать все DLL-файлы, известные человечеству.

0 голосов
/ 07 октября 2011

Используйте GetAdaptersAddresses () для перечисления всех доступных IP-адресов интерфейса.

IP_MULTICAST_IF только для адресов IPv4. Ожидается, что вы передадите значение DWORD, содержащее нужный адрес IPv4 (в порядке байтов в сети), в setsockopt(), например:

DWORD dwIP = ...;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&dwIP, sizeof(dwIP));
...