2

如果这已经在某个地方得到了回答,我很抱歉,但我似乎无法在这里找到适合我一生的答案。

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

  1. 从 PC 发送包含指定命令的广播数据包 (255.255.255.255)(来自源端口 HOST_PORT,目标端口 DEVICE_PORT)。
  2. 让设备在广播数据包中侦听该命令。然后设备用它自己的广播数据包从端口 DEVICE_PORT 到端口 HOST_PORT 进行响应。
  3. 我的应用程序收到包含一系列信息(例如序列号)的回复数据包,并枚举了网络上的所有设备。

我已经(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
  • 远程设备运行良好(我有一个串行调试连接来检查这个)
4

0 回答 0