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

news/2024/5/18 15:29:33 标签: c++, 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.niftyadmin.cn/n/5037394.html

相关文章

怎么优化企业内部的报修流程?有什么好用的企业智能报修管理系统?

随着数字化转型成为企业的新风向&#xff0c;传统的企业报修方式已经变得不够便捷。传统的报修流程往往依赖于企业内部的组织架构&#xff0c;给员工和用户带来了许多麻烦。报修人需要注册、登录、下载和安装相关软件&#xff0c;而且一个故障报修还需要进行多个步骤的操作才能…

LESS的叶绿素荧光模拟实现与操作

LESS的叶绿素荧光模拟实现与操作 前情提要FLUSPECT模型荧光的三维面元冠层辐射传输过程日光诱导叶绿素荧光模拟 前情提要 本文默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有…

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了&#xff0c;平台也有各种各样的中秋发文活动&#xff0c;正在翻阅时偶然间我看到了这篇文章&#xff1a;《兔饼大作战》&#xff1a;吃月饼、见月亮&#xff0c;还能咬自己&#xff1f;| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…

Java笔记:Java虚拟机的指令

1. 字节码指令集 1.1 概述 Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字&#xff08;称为操作码&#xff0c;Opcode&#xff09; 以及跟随其后的零至多个代表此操作所需参数&#xff08;称为操作数&#xff0c;Operands&#xff09;而构成。 比如&#x…

Maven高级---分模块设计,继承(继承关系/版本锁定/自定义属性)

目录 分模块设计 继承与聚合 继承关系 ​案例​ 版本锁定 自定义属性/引用属性 分模块设计 把一个项目拆分成不同的模块 我们可以把原来一个项目包中的东西单独提出来作为一个模块,也是解耦的思想 然后我们可以通过引入依赖的方式将这两个模块引入,如下 继承与聚合 继…

IMX6ULL移植篇-Linux内核源码目录分析一

一. Linux内核源码目录 之前文章对 Linux内核源码的文件做了大体的了解&#xff0c;如下&#xff1a; IMX6ULL移植篇-Linux内核源码文件表_凌肖战的博客-CSDN博客 本文具体说明 Linux内核源码的一些重要文件含义。 二. Linux内核源码中重要文件分析 1. arch 目录 这个目录…

数据结构(C语言)——栈的两种实现方式

下面来介绍栈的两种实现方式&#xff1a; 一、数组 #include<stdio.h> #include<stdlib.h> #define E int #define MAX_STACK 5 //数据结构-栈&#xff08;数组实现&#xff09; typedef struct my_stack {E *sta;//栈大小为5int pos;//栈顶位置 }my_stack; //初…

C# 连接mysql数据库ADO.NET模式, 数据绑定到datagridview控件上,设置部分列隐藏

/********* C#连接MYSQL数据库的步骤ADO.NET模式&#xff1a;************/ //1.导入命名空间 MySql.Data.MySqlClient //2.创建一个 MySqlConnection 对象&#xff0c;并传入连接字符串。连接字符串包含了数据库的地址、用户名、密码等信息 //3.调用 MySqlConnection 的 Op…