2009-04-30 2 views
2

Решение для Windows XP или выше. Предпочтительно в C# или в C++.Отправлять широковещательную рассылку UDP (255.255.255.255) только от конкретного адаптера (например, 192.168.101.1); на Windows

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

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

ответ

2

Просто привяжите() разъем к нужному интерфейсу вместо использования 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

Возможно ли это непосредственно в C#? Или вы должны создать свою собственную упаковку, например. C++/CLI? – nietras

+0

var localEndPoint = новый IPEndPoint (IPAddress.Parse ("192.168.103.1"), 0); using (var socket = new UdpClient (localEndPoint)) { var remoteEndPoint = новый IPEndPoint (IPAddress.Parse ("255.255.255.255"), 3956); var datagram = новый байт [] {0x11, 0x22, 0x33, 0x44}; // Попытка отправить широковещательную дейтаграмму только с локальной конечной точки // но передача передает пакет со всех сетевых адаптеров в соответствии с Wireshark socket.Send (датаграмма, датаграмма.Length, remoteEndPoint); } – nietras

+0

Хмм как вы вставляете код правильно? Anyhoo, это не работает, поэтому полученный ответ не работает. – nietras

1

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

0

The broadcast address 255.255.255.255 is too general. Вы должны создать другой широковещательный адрес для каждого сетевого интерфейса отдельно.

+0

Не работает для моей проблемы, поскольку целевое устройство принимает только 255.255.255.255. – nietras

2

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

Смежные вопросы