当前位置: 首页 > news >正文

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库加入组播的代码

#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套接字找不到网卡去加入组播。

  • 设置默认路由即可解决程序崩溃问题
route add -net 0.0.0.0 netmask 0.0.0.0 dev enp0s3
  • 查看路由表
    在这里插入图片描述
Linux系统中必须设置0.0.0.0的默认路由规则,否则程序加入组播时会宕掉。
http://www.lryc.cn/news/167179.html

相关文章:

  • 华为HCIA(四)
  • Qt --- Day01
  • 24.98万起,新一代AITO问界M7值得买吗?
  • Java毕业设计 SSM SpringBoot 水果蔬菜商城
  • 前端JS中的异步编程与Promise
  • Pytorch Advanced(二) Variational Auto-Encoder
  • Flask 使用 JWT(三)flask-jwt-extended
  • 堆与栈的区别
  • OpenWrt kernel install分析(2)
  • 【计算机网络】传输层协议——TCP(下)
  • Vue前端页面打印
  • Visual Studio将C#项目编译成EXE可执行程序
  • git把某一次commit修改过的文件打包导出(git)
  • Vue3 Ajax(axios)异步
  • idea2023全量方法debug
  • Docker镜像解析获取Dockerfile文件
  • 使用maven命令打jar包
  • 【多线程】死锁 详解
  • 成考[专升本政治]科目必背知识点
  • spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表
  • 【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)
  • 多线程|多进程|高并发网络编程
  • 云计算——ACA学习 云计算分类
  • 3 分钟,带你了解低代码开发
  • 小白学Unity03-太空漫游游戏脚本,控制飞船移动旋转
  • 接口自动化测试推荐用什么框架?
  • 防火墙 FireWall
  • 【Linix-Day12-线程同步和线程安全】
  • C++中使用嵌套循环遍历多维数组
  • linux入门---命名管道