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

2

Решение для Windows XP или выше. Предпочтительно в С# или в С++.

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

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

Теги:
udp
broadcast

4 ответа

2

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

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?
  • 0
    var localEndPoint = новый IPEndPoint (IPAddress.Parse ("192.168.103.1"), 0); using (var socket = new UdpClient (localEndPoint)) {var remoteEndPoint = new IPEndPoint (IPAddress.Parse ("255.255.255.255"), 3956); переменная датаграмма = новый байт [] {0x11, 0x22, 0x33, 0x44}; // Попытка отправить широковещательную дейтаграмму только из локальной конечной точки // но отправка транслирует пакет со всех сетевых адаптеров в соответствии с сокетом Wireshark.Send (дейтаграмма, datagram.Length, remoteEndPoint); }
Показать ещё 1 комментарий
1

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню