【问题标题】:Fail to listen to UDP Port with boost::asio使用 boost::asio 监听 UDP 端口失败
【发布时间】:2012-02-18 01:36:15
【问题描述】:

我有一个服务器,它收集信息并通过本地网络广播一些消息。我正在使用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):服务器和客户端在同一台机器上运行。服务器每两秒从端口34050(源)向8079(目标)发送一条88 bytes 消息。 192.168.2.102 是本地网络中机器的ip。

【问题讨论】:

  • 尝试“0.0.0.0”或ip::address_v4::any作为您的本地端点地址。
  • 您的接收器是否需要绑定到特定的网络接口?
  • @Emile Cormier ip::address_v4::any() 除了绑定到0.0.0.0:8079 之外没有任何改变。关于第二个问题,我认为bind 是指定要监听的端口所必需的;我错了吗?
  • 是的,据我了解,bind 指定了端口。但是bind也用来指定网络接口。指定“0.0.0.0”(或等效的ip::address_v4::any)意味着您不关心广播流量到达的接口。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没有完成处理程序 - 通信是同步的。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多