在Windows 7下使用boost :: asio接收UDP广播数据包

时间:2012-08-14 07:01:59

标签: udp boost-asio ipv4

如果已经在某个地方得到了回答,我表示道歉,但我似乎无法在这里为我的生活找到合适的答案。

我的问题是:我正在开发一个带有以太网接口的嵌入式应用程序。即使我不知道设备的IP,我也需要能够在网络上发现这些设备并配置它们的IP。我的预期方法如下:

  1. 从包含指定命令的PC(从源端口HOST_PORT,目标端口DEVICE_PORT)传输广播数据包(255.255.255.255)。
  2. 让设备在广播包中侦听该命令。然后,设备将自己的广播数据包从端口DEVICE_PORT响应到端口HOST_PORT。
  3. 我的应用程序收到回复数据包,其中包含大量信息,如序列号,并枚举网络上的所有设备。
  4. 我已经(1)和(2)工作,尝试在PC上接收广播数据包时出现问题。我已经使用Wireshark验证了数据包实际上是否正确地进入了网络,所以使用boost时一定是错误的。

    以下是我正在使用的代码片段:

        using namespace boost::asio;
    
        io_service my_io_service;                           // Create socket and IO service, bind socket to endpoint.
        ip::udp::socket socket(my_io_service);
        socket.open(ip::udp::v4());
    
        ip::udp::endpoint localEndpoint(ip::address_v4::any(), HOST_PORT );
        ip::udp::endpoint remoteEndpoint(ip::address_v4::broadcast(), DEVICE_PORT );
    
        socket.bind( localEndpoint );
        socket.connect( remoteEndpoint );
        socket_base::broadcast option(true);
        socket.set_option(option);
    
    
        TXMessage.str("");
        TXMessage << "RECQRE" << (i++);
        socket.send(buffer(TXMessage.str().c_str(), TXMessage.str().length()));
        len = socket.receive(buffer(RXBuffer, (BUFFER_SIZE-1)));
    

    该应用程序只需锁定socket.recieve(...)调用。任何人都可以看到这个代码或配置的明显问题?我相信我有约束力和适当的联系,我知道我正在设置'广播'选项。

    或者,如果您认为我的设备识别问题错了,我很高兴能够指出解决设备识别问题的替代方案。

    修改 我已经检查过的事情:

    • 我绑定到INADDR_ANY
    • Windows防火墙已被禁用
    • 该应用程序已经过测试,没有运行Wireshark
    • 远程设备还活着(我有一个串行调试连接来检查)

0 个答案:

没有答案