如果这已经在某个地方得到了回答,我很抱歉,但我似乎无法在这里找到适合我一生的答案。
我的问题是:我正在开发一个带有以太网接口的嵌入式应用程序。即使我不知道设备的 IP,我也需要能够在网络上发现这些设备并配置它们的 IP。我的预期方法如下:
- 从 PC 发送包含指定命令的广播数据包 (255.255.255.255)(来自源端口 HOST_PORT,目标端口 DEVICE_PORT)。
- 让设备在广播数据包中侦听该命令。然后设备用它自己的广播数据包从端口 DEVICE_PORT 到端口 HOST_PORT 进行响应。
- 我的应用程序收到包含一系列信息(例如序列号)的回复数据包,并枚举了网络上的所有设备。
我已经(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
- 远程设备运行良好(我有一个串行调试连接来检查这个)