Решение для Windows XP или выше. Предпочтительно в С# или в С++.
Мы не хотим транслировать, используя широковещательную рассылку подсети (например, 192.168.101.255), поскольку устройство, с которым мы пытаемся связаться, не отвечает на это. Вместо этого мы хотим иметь возможность отправлять UDP-дейтаграмму с адресатом 255.255.255.255 только из конкретного NIC/IPAddress, так что широковещательная передача НЕ отправляется на другие сетевые адаптеры.
Это означает, что мы должны обойти стек IP, который, таким образом, является вопросом. Как мы можем обойти стек IP в Windows для отправки дейтаграммы, совместимой с UDP/IP, только с определенного NIC/MAC-адреса?
Чтобы использовать WinPcap для отправки необработанного pcaket в С#, вы можете использовать Pcap.Net. Это оболочка для WinPcap, написанная на С++/CLI и С#, и включает в себя структуру интерпретации и создания пакетов.
Просто привяжите() сокет к нужному интерфейсу вместо использования 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);
Я не пробовал это, но я знаю, что WinPCap позволяет вам делать raw отправить. Так как он работает на довольно низком уровне, он может позволить вам отправить достаточно низкий уровень в стеке, чтобы обойти полную трансляцию. Там есть различные обертки С#, и, конечно же, вы можете использовать обычный код C/С++. Я думаю, что трюк может заключаться в привязке к правильному адаптеру, который вы хотите отправить, и он может просто работать.
Широковещательный адрес 255.255.255.255 является слишком общим. Вы должны создавать отдельный широковещательный адрес для каждого сетевого интерфейса отдельно.