无法使用boost :: asio监听UDP端口

时间:2012-02-18 01:36:16

标签: c++ boost udp client boost-asio

我有一台服务器收集信息并通过本地网络广播一些消息。我正在使用boost::asio通过端口8079上的UDP广播它们,我可以通过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),我不确定是否可能导致这些问题:服务器和客户端在同一台机器上运行。服务器每两秒从端口88 bytes(源)向34050(目标)发送8079消息。 192.168.2.102是本地网络中机器的IP。

2 个答案:

答案 0 :(得分:4)

IIRC,您必须绑定到INADDR_ANY才能接收广播数据包。 Linux message lists讨论了这个问题,有很多讨论。除此之外,请确保两台计算机上的网络掩码匹配。如果广播转到192.168.255.255并且您的客户端网络掩码是255.255.255.0,则不会收到数据包。

答案 1 :(得分:-2)

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