加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:29:06 所属栏目:百科 来源:网络整理
导读:我有一台服务器收集信息并通过本地网络广播一些消息.我正在使用boost :: asio通过端口8079上的UDP广播它们,我可以通过WireShark验证这些数据包实际上是按预期广播的. 现在,当然,我想跟进一个可以对这些消息作出反应的听众,但我很难接受任何东西.我目前的做法
我有一台服务器收集信息并通过本地网络广播一些消息.我正在使用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(源)发送一个88字节的消息到8079(目的地). 192.168.2.102是本地网络中机器的IP.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读