代码之家  ›  专栏  ›  技术社区  ›  nietras

仅从特定适配器(例如192.168.101.1)发送UDP广播(255.255.255.255);在Windows上

  •  2
  • nietras  · 技术社区  · 16 年前

    Windows XP或更高版本的解决方案。最好是C语言,或者C++语言。

    我们不希望使用子网定向广播(例如192.168.101.255)进行广播,因为我们尝试联系的设备对此没有响应。相反,我们希望只能从特定的NIC/IP地址发送目标为255.255.255.255的UDP数据报,这样广播就不会在其他NIC上发送。

    这意味着我们必须绕过IP堆栈,这就是问题所在。如何绕过windows上的ip堆栈,只从特定的nic/mac地址发送udp/ip兼容的数据报?

    4 回复  |  直到 11 年前
        1
  •  2
  •   Chris Becke    16 年前

    只需将套接字绑定到所需的接口,而不是使用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);
    
        2
  •  2
  •   brickner    15 年前

    为了使用winpcap在c_中发送原始pcaket,可以使用 Pcap.Net . 它是用C++/CLI和C语言编写的WiPCAP的包装器,包括包解释和创建框架。

        3
  •  1
  •   Erich Mirabal    16 年前

    我没试过,但我知道winpcap允许你做一个raw send . 因为它的工作级别很低,所以它可能允许您在堆栈上发送足够低的数据以绕过完整的广播。那里有各种各样的C包装,当然你也可以使用普通的C/C++代码。我认为诀窍可能是绑定到要从中发送的正确适配器,它可能只是起作用。

        4
  •  0
  •   JimB    15 年前

    The broadcast address 255.255.255.255 is too general. 你必须为每个网络接口分别设计一个不同的广播地址。