Отправлять широковещательную рассылку UDP (255.255.255.255) только от определенного адаптера (например, 192.168.101.1); в Windows - PullRequest
2 голосов
/ 30 апреля 2009

Решение для Windows XP или выше. Желательно в C # или в C ++.

Мы не хотим транслировать с использованием широковещательной рассылки, направленной на подсеть (например, 192.168.101.255), поскольку устройство, с которым мы пытаемся связаться, не отвечает на это. Вместо этого мы хотим иметь возможность отправлять дейтаграмму UDP с пунктом назначения 255.255.255.255 только с определенного NIC / IP-адреса, чтобы широковещательная рассылка НЕ ​​отправлялась на другие NIC.

Это означает, что мы должны обойти стек IP, что, таким образом, является вопросом. Как мы можем обойти стек IP в окнах для отправки дейтаграммы, совместимой с UDP / IP, только с определенного NIC / MAC-адреса?

Ответы [ 4 ]

2 голосов
/ 19 апреля 2010

Чтобы использовать WinPcap для отправки необработанного pcaket в C #, вы можете использовать Pcap.Net . Это оболочка для WinPcap, написанная на C ++ / CLI и C #, и включает в себя инфраструктуру интерпретации и создания пакетов.

2 голосов
/ 07 мая 2009

Просто привяжите () сокет к нужному интерфейсу вместо использования INADDR_ANY?

// Make a UDP socket
SOCKET s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
// Bind it to a particular interface
sockaddr_in name={0};
name.sin_family = AF_INET;
name.sin_addr.s_addr = inet_addr("192.168.101.3"); // whatever the ip address of the NIC is.
name.sin_port = htons(PORT);
bind(s,(sockaddr*)name);
1 голос
/ 07 мая 2009

Я не пробовал это, но я знаю, что WinPCap позволяет вам делать необработанные отправки . Так как он работает на довольно низком уровне, он может позволить вам отправить достаточно низко в стеке, чтобы обойти полную трансляцию. Существуют различные оболочки C #, и, конечно, вы можете использовать обычный код C / C ++, доступный там. Я думаю, что хитрость может заключаться в том, чтобы привязать нужный адаптер, из которого вы хотите отправить, и он может просто сработать.

0 голосов
/ 05 февраля 2010

Широковещательный адрес 255.255.255.255 слишком общий. Необходимо создать разные широковещательные адреса для каждого сетевого интерфейса отдельно.

...