使用boost::asio监听UDP端口失败

4
我有一台服务器,收集信息并通过本地网络广播一些消息。我使用boost::asio通过UDP在8079端口广播这些消息,并且我可以用WireShark验证这些数据包确实按照预期进行广播。
现在,自然而然的,我想要跟进一个监听器来响应这些消息,但是我无法接收到任何东西。我目前的方法是:
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::endpoint local(
    boost::asio::ip::address::from_string("192.168.2.102"),
    8079);
boost::system::error_code error;

std::cout << "Local bind: " << local << std::endl;

socket.open(boost::asio::ip::udp::v4(), error);
if(!error) {
    socket.bind(local);
    boost::array<char, 2048> buf;
    boost::asio::ip::udp::endpoint server;
    std::cout << "Listening..." << std::endl;
    while(true) {
        size_t len = socket.receive_from(boost::asio::buffer(buf), server);
        std::cout << "Received data:" << std::endl;
        std::cout.write(buf.data(), len);
        std::cout << std::endl;
    }
}

但是我从未收到任何信息。使用调试器,我发现自己一直卡在receive_from里,而且不知道为什么。
以下是一些其他信息(主要来自Wireshark),我不确定它是否可能导致这些问题:服务器和客户端在同一台机器上运行。 服务器每两秒钟从端口34050(源)向8079(目标)发送一个88字节的消息。 192.168.2.102 是本地网络中该计算机的IP地址。

1
尝试使用“0.0.0.0”或ip::address_v4::any作为本地终端点地址。 - Emile Cormier
您的接收器是否需要绑定到特定的网络接口? - Emile Cormier
@Emile Cormier ip::address_v4::any() 除了绑定到 0.0.0.0:8079 外,不会改变任何东西。关于你的第二个问题,我认为需要使用 bind 来指定要监听的端口,我错了吗? - nikolas
是的,据我所知,bind指定了端口。但是bind也用于指定网络接口。指定“0.0.0.0”(或等效的ip::address_v4::any)意味着您不关心广播流量到达的接口是什么。 - Emile Cormier
2个回答

4
据我所知,您需要绑定到INADDR_ANY才能接收广播数据包。在Linux消息列表中有很多讨论此问题的帖子。此外,确保两台计算机的子网掩码匹配。如果广播发送到192.168.255.255,而客户端的子网掩码为255.255.255.0,则将无法接收数据包。

-2

你没有在任何线程上调用io_service::run,因此即使接收到数据,完成处理程序也不会被调用。


没有完成处理程序 - 通信是同步的。 - cirrusio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接