程序崩溃情况

  • 本程序运行在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();
                                          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的默认路由规则,否则程序加入组播时会宕掉。
// ~~~~~~~~~~ // Distributed under the Boost Software License, Version 1.0. (See accompany
Boost.Asio入门 首先,让我们先来了解一下什么是Boost.Asio?怎么编译它?了解的过程中我们会给出一些例子。然后在发现Boost.Asio不仅仅是一个网络的同你也会接触到Boost.Asio中最核心的类——io_service。 什么是Boost.Asio 简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++。 计算机网络的
asio_service_discovery 通过udp组播进行服务发现的组件。 它使用boost :: asio进行异步网络连接。 它是非阻塞和非锁定的。 最好的入门方法是。 基本功能源自。 请注意,udp数据包的最大数据包大小受到限制。 该支持正在运行的机器上udp数据包的最大大小(在我的机器上为〜8kb)。 但是在选择服务名称请记住这一点。 但是,低于kb的任何内容都可以。 如果收到“消息过长”错误,请确保没有选择过长的服务名。 asio_service_discovery正在使用boost :: asio,因此您需要boost asio标头,并且需要再次链接boost_system。 您还需要支持C ++ 11的编译器 如果要运行测试,还需要安装cmake 这个怎么运作 有两个组件:service_announcer和service_discoverer。
Boost.Asio使用总结 首先,让我们先来了解一下什么是 Boost.Asio?怎么编译它?了解的过程中我们会给出一些例子。然后在发现 Boost.Asio 不仅仅是一个网络的同你也会接触到 Boost.Asio 中最核心的类——io_service。 什么是Boost.Asio 简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的 C++ boost::asio::ip::udp::socket socket(io_service);  boost::asio::ip::address multicast_address = boost::asio::ip::address::from_string("225.0.
最近在做项目的候,遇到一个问题:就是阻塞模式下的UDP在接收(recvfrom)的候,如果没有收到数据包,程序会一直阻塞。 在Windows下可以通过设置超间来解决这个问题。struct timeval TimeOut; TimeOut.tv_sec = 1; TimeOut.tv_usec = 0; ::setsockopt(sockServer, SOL_SOCKET, SO_RCVT
boost::system::system_error相关的测试程序实现功能C++实现代码 boost::system::system_error相关的测试程序 C++实现代码 #include <boost/system/system_error.hpp> #include <boost/config.hpp> #if defined(THROW_DYN_LINK) # define EXPORT BOOST_SYMBOL_EXPORT #else # define EX
Boost.System 可以由特定操作系统平台的错误代码转换出跨平台的错误代码。 Boost.Exception 允许给任何异常添加额外的信息,以便利用 catch 相应的处理程序更好的对异常作出反应。 #include <boost/system/error_code.hpp> #include <boost/asio.hpp> #include <boost/system/system_
使用Boost的项目编译boost/asio/impl/executor.hpp(218)中出现如下错误: error C2678: 二进制“==”: 没有找到接受“const std::reference_wrapper<boost::asio::io_service>”类型的左操作数的运算符(或没有可接受的转换) 看网络说是const问题,但以前没出现过这个问题,看了一...