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

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

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

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


person nietras    schedule 30.04.2009    source источник


Ответы (4)


Просто привяжите () сокет к нужному интерфейсу вместо использования 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);
person Chris Becke    schedule 07.05.2009
comment
Возможно ли это непосредственно в С#? Или вам придется создать свою собственную оболочку, например. С++/командная строка? - person nietras; 02.06.2009
comment
var localEndPoint = новый IPEndPoint(IPAddress.Parse(192.168.103.1), 0); использование (var socket = новый UdpClient (localEndPoint)) { var remoteEndPoint = новый IPEndPoint (IPAddress.Parse (255.255.255.255), 3956); var дейтаграмма = новый байт [] {0x11, 0x22, 0x33, 0x44}; // Попытка отправить широковещательную дейтаграмму только из локальной конечной точки, // но при отправке пакет передается со всех сетевых адаптеров в соответствии с Wireshark socket.Send(datagram, datagram.Length, remoteEndPoint); } - person nietras; 03.06.2009
comment
Хм, как правильно вставить код? Во всяком случае, это не работает, поэтому данный ответ не работает. - person nietras; 03.06.2009

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

person brickner    schedule 19.04.2010

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

person Erich Mirabal    schedule 07.05.2009

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

person JimB    schedule 05.02.2010
comment
Не подойдет для моей проблемы, так как целевое устройство будет принимать только 255.255.255.255. - person nietras; 08.02.2010