C++使用Boost库加入UDP组播时程序崩溃

程序崩溃情况

  • 本程序运行在Oracle VM VirtualBox虚拟的Ubuntu20.04

    terminate called after throwing an instance of 'boost::wrapexceptboost::system::system_error' what(): set_option: No such device 已放弃 (核心已转储) **

  • C++使用Boost库加入组播的代码

c 复制代码
#include <iostream>
#include <boost/asio.hpp>

class MulticastReceiver
{
public:
    MulticastReceiver(boost::asio::io_context &ioContext, const std::string &multicastAddress, const std::string &listenAddress, int port)
        : ioContext(ioContext),
          socket(ioContext),
          multicastEndpoint(boost::asio::ip::address::from_string(multicastAddress), port),
          listenEndpoint(boost::asio::ip::address::from_string(listenAddress), port)
    {
        // 创建套接字
        socket.open(listenEndpoint.protocol());

        // 设置套接字选项,允许地址重用
        socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));

        // 绑定到监听地址
        socket.bind(listenEndpoint);

        // 加入组播组
        socket.set_option(boost::asio::ip::multicast::join_group(multicastEndpoint.address()));
    }

    void start()
    {
        receive();
    }

private:
    void receive()
    {
        socket.async_receive_from(boost::asio::buffer(buffer), senderEndpoint,
                                  [this](const boost::system::error_code &error, std::size_t bytesTransferred)
                                  {
                                      if (!error)
                                      {
                                          // 处理接收到的数据
                                          std::cout << "Received: " << std::string(buffer.data(), bytesTransferred) << std::endl;

                                          // 继续接收数据
                                          receive();
                                      }
                                      else
                                      {
                                          std::cerr << "Error receiving data: " << error.message() << std::endl;
                                      }
                                  });
    }

private:
    boost::asio::io_context &ioContext;
    boost::asio::ip::udp::socket socket;
    boost::asio::ip::udp::endpoint multicastEndpoint;
    boost::asio::ip::udp::endpoint listenEndpoint;
    std::array<char, 1024> buffer;
    boost::asio::ip::udp::endpoint senderEndpoint;
};

  • Boost库报错信息时No such device

Boost库中boost::asio::ip::udp::socket套接字找不到网卡去加入组播。

  • 设置默认路由即可解决程序崩溃问题
shell 复制代码
route add -net 0.0.0.0 netmask 0.0.0.0 dev enp0s3
  • 查看路由表

|------------------------------------------|
| Linux系统中必须设置0.0.0.0的默认路由规则,否则程序加入组播时会宕掉。 |

相关推荐
6Hzlia18 分钟前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
qq_120840937132 分钟前
Three.js 工程向:GLTFLoader 管线、Draco/KTX2 与资源管理
开发语言·javascript·ecmascript
下地种菜小叶40 分钟前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
csbysj20201 小时前
业务代表模式
开发语言
sghuter1 小时前
AI重塑工程师:未来核心能力全景图
开发语言·perl·composer·symfony
浪客川1 小时前
【百例RUST - 013】泛型
开发语言·后端·rust
Robot_Nav2 小时前
DPMPC-Planner:复杂静态环境与动态障碍物下的无人机实时轨迹规划框架
c++·无人机·mpc
iiiiyu2 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你912 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
qq_12084093712 小时前
Three.js 工程向:Clock、deltaTime 与固定步长主循环
开发语言·javascript·ecmascript