boost的asio接收单路大数据量udp包的方法

2023-05-16

开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个问题,而boost的asio在windows上是基于完成端口来开发的,所以采用boost的asio和环形缓冲区的方法,可以解决接收单路大数据量udp包中丢包的问题。

    需要引入的头文件为:

 

[cpp]  view plain  copy
 
  1. #include "CircledBuffer.h"  
  2. #include <iostream>  
  3. #include <boost/asio.hpp>  
  4. #include <boost/bind.hpp>  

其中CircledBuffer.h是自定义的缓冲区的类,之后会有介绍,boost的两个文件是asio必需的两个文件。

 

    需要定义的全局变量为:

 

[cpp]  view plain  copy
 
  1. using boost::asio::ip::udp;  
  2. boost::asio::io_service service;  
  3. boost::asio::ip::udp::socket sock(service);  
  4. boost::asio::ip::udp::endpoint sender_ep;  
  5. CircledBuffer readBuffer;  
  6. PacketBuffer* packet;  

其中io_service是用来标示启动的,后面会调用run。sock和endpoint类似于描述符和sockaddr_in的关系。CircledBuffer和PacketBuffer*,是自定义缓冲区。

 

 

主函数为:

 

[cpp]  view plain  copy
 
  1. int main(int argc, char* argv[]) {  
  2.     boost::asio::ip::udp::endpoint ep( boost::asio::ip::address::from_string("192.168.1.206"),  
  3.         9002);  
  4.     sock.open(ep.protocol());  
  5.     sock.set_option(boost::asio::ip::udp::socket::reuse_address(true));  
  6.     boost::asio::socket_base::receive_buffer_size recv_option(8*65534);  
  7.     sock.set_option(recv_option);  
  8.     sock.bind(ep);  
  9.     packet = readBuffer.GetLast();  
  10.     sock.async_receive_from(boost::asio::buffer(packet->data, packet->bufferSize), sender_ep, &on_read);  
  11.     service.run();  
  12. }  


初始化ep和sock,其中udp接收的数量比较大的话,需要设定receive_buffer_size,然后bind,设置接受buffer为packet。

 

介绍一下async_receive_from函数,它有三个参数,分别为接收的buffer,远端的ep,注意与本端的ep不同,远端的ep不用初始化设置,再就是buffer收满后的回调函数。

 

回调函数的内容是:

 

[cpp]  view plain  copy
 
  1. void on_read(const boost::system::error_code & err, std::size_t  
  2.              read_bytes) {  
  3.         std::cout << "read: " << read_bytes << std::endl;  
  4.         readBuffer.MoveNext();  
  5.         packet= readBuffer.GetLast();  
  6.         sock.async_receive_from(boost::asio::buffer(packet->data, packet->bufferSize), sender_ep, &on_read);  
  7. }  

与main函数的接收部分一致,这里用了不断的自身回调,来实现while recvfrom的功能。

 

补充说一句,用申请好的CircledBuffer,便于后期的多线程或者异步strand的处理,而不阻塞接收。

缓冲区类的代码:

头文件:

 

[cpp]  view plain  copy
 
  1. #ifndef CIRCLED_BUFFER_H  
  2. #define CIRCLED_BUFFER_H  
  3.   
  4. #include <memory.h>  
  5. #include <boost/atomic.hpp>  
  6. #define CIRCLED_BUFFER_SIZE 300  
  7. #define BUFFER_SIZE 2000  
  8.   
  9. struct PacketBuffer  
  10. {  
  11.     PacketBuffer(){bufferSize=BUFFER_SIZE;dataSize=0;}   
  12.     unsigned int bufferSize;  
  13.     unsigned int dataSize;  
  14.     char data[BUFFER_SIZE];  
  15.   
  16.     PacketBuffer& operator=(PacketBuffer& other)  
  17.     {  
  18.         memcpy(data,other.data,other.dataSize);  
  19.         dataSize = other.dataSize;  
  20.         bufferSize = other.bufferSize;  
  21.         return *this;  
  22.     }  
  23. };  
  24.   
  25. class CircledBuffer  
  26. {  
  27. public:  
  28.     CircledBuffer(unsigned int bufSize=CIRCLED_BUFFER_SIZE);  
  29. public:  
  30.     ~CircledBuffer(void);  
  31.     PacketBuffer* GetAt(unsigned int idx){return &packets[idx];}  
  32.     PacketBuffer* GetLast()  
  33.     {         
  34.         return GetAt(writeIndex.load(boost::memory_order_consume));  
  35.     };  
  36.     void MoveNext()  
  37.     {  
  38.         unsigned int idx = writeIndex.load(boost::memory_order_relaxed);  
  39.         writeIndex.store((idx+1)%bufferSize,boost::memory_order_release);  
  40.     };  
  41.     unsigned int GetLastIndex(){return writeIndex.load(boost::memory_order_consume);};  
  42.     unsigned int GetSize(){return bufferSize;};  
  43. protected:  
  44.     boost::atomic<unsigned int> writeIndex;  
  45.     unsigned int bufferSize;  
  46.     PacketBuffer* packets;  
  47. };  
  48. #endif  


缓冲区类的构造函数与析构函数

 

 

[cpp]  view plain  copy
 
  1. #include "CircledBuffer.h"  
  2.   
  3. CircledBuffer::CircledBuffer(unsigned int bufSize)  
  4. :bufferSize(bufSize),  
  5. writeIndex(0)  
  6. {  
  7.     packets = new PacketBuffer[bufSize];  
  8. }  
  9.   
  10. CircledBuffer::~CircledBuffer(void)  
  11. {  
  12.     delete []packets;  
  13. }  


源代码下载链接

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost的asio接收单路大数据量udp包的方法 的相关文章

  • 2.如何优化操作大数据量数据库(改善SQL语句)

    二 改善SQL语句 很多人不知道SQL语句在SQL SERVER中是如何执行的 xff0c 他们担心自己所写的SQL语句会被SQL SERVER误解 比如 xff1a select from table1 where name 61 39
  • LACP和PAgP的四种模式

    PAgP的四种模式 模式含义开启 xff08 on xff09 端口不进行协商 xff0c 直接形成以太网通道 xff1b 在这种模式下 xff0c 对端必须也是on模式 xff0c 以太网通道才能正常工作 关闭 xff08 off xff
  • BGP的同步

    实验原理 xff1a BGP 同步规则 xff1a BGP 路由器不应使用通过 IBGP 获悉的路由或将其通告给外部邻居 xff0c 除非该路由是本地的或通过 IGP 获悉的 如果启用了同步 xff0c 则路由器通过 IBGP 获悉路由后
  • 【软件工程导论-ZZU】02. 软件生命周期、开发过程与模型

    二 软件生命周期 开发过程与模型 1 软件生命周期 软件生命周期 xff1a 是软件的产生直到报废或停止使用的生命周期 实际从事软件开发工作时 xff0c 软件规模 类型 开发环境及技术方法等因素会影响到阶段划分 xff0c 及各阶段的执行
  • MySQL5.7安装与配置(YUM)

    安装环境 xff1a CentOS7 64位 xff0c MySQL5 7 1 配置YUM源 在MySQL官网中下载YUM源rpm安装包 xff1a http dev mysql com downloads repo yum span cl
  • ONOS高可用性和可扩展性实现初探

    为什么80 的码农都做不了架构师 xff1f gt gt gt ONOS 的发布直面OpenDaylight 进行挑战 xff0c 直接将 SDN 领域两大阵营 xff08 运营商和设备商 xff09 的竞争瞬间升级 xff0c 之所以 O
  • java a 运算_java中a++和++a在较复杂的运算中分析

    以下是一段普遍都了解的代码 xff1a public static void main String args int a 61 3 System out println a 43 43 43 1 4 System out println
  • Boom!!!计算机系统,从理解到爆炸,Bomblab

    进入目录下 bomb 开始运行炸弹 对于炸弹command not found之类的鬼畜情况 xff1a chmod 777 bomb 然后再运行炸弹 objdump d bomb gt bomb s 把整个代码打到文件里去 xff0c 也
  • 笔记本无法连接校园网,windows诊断显示校园网之未响应

    打开cmd xff08 管理员 xff09 xff1a 输入以下四条 xff0c 每一条都按enter ipconfig flushdns ipconfig registerdns ipconfig release ipconfig ren
  • 判断两个IP是否处于同一子网(网段)

    大学的时候有上过计算机网络的课程 xff0c IP这块也有一些接触 xff0c 但向来不是很好学的我 xff0c 对于一些问题似是而非的态度 xff0c 感觉知道 xff0c 但具体的又说不上 xff0c 今天就花了点时间彻底把这个问题搞清
  • zeromq发送文件到服务器,将zeromq套接字连接到redis服务器以进行数据传输?

    我想将服务器上的消息 ZMQ ROUTER套接字 xff0c 处理多个客户端 传输到redis服务器以用于存储目的 我听说 xff0c redis不会说ZMQ 所以如果不搭桥 xff0c 就不可能实现 我接受你的建议 在哪里看 xff1f
  • 历数NFV的发展历程

    随着网络产业正在通过SDN转型 xff0c NFV的互补架构概念越来越突出 为解释这种状况 xff0c 下文中将对NFV的定义 如何出现以及如何影响企业数据中心加以阐释 NFV的定义 维基百科对于NFV的定义是 xff1a NFV是使用虚拟
  • 线程相关知识

    线程的概念 1 xff0e 线程 1 线程是由表示程序运行状态的寄存器 包括程序计数器和堆栈 组成的 2 线程是程序执行过程中的某一时刻的状态 3 线程是一个用户级的实体 xff0c 在内存中驻留在普通用户级方法可以直接访问的区域 4 每个
  • 白盒交换机操作系统混战

    白盒交换机的出现给了用户选择最佳软硬件平台的权利 xff0c 它仅仅提供交换机硬件和ONIE xff08 开放网络安装环境 xff09 xff0c 用户可以自行选择最合适的交换机芯片 xff0c 降低成本实现最大效益 但是白盒交换机没有软件
  • Mysql修改设置root密码的命令及方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 方法一 xff1a 使用SQL语句命令UPDATE 需用到Mysql自带的加密函数PASSWORD string xff0c 该函数对一个明文密码进行加密 xff0c 但不
  • python中if有多个条件_Python if有多个条件怎么办

    Python中if有多个条件的处理方法 python中if有多个条件 可以使用and or elif关键字来连接 代码为 if name zs and age 18 print name zs age 18 Python中if有多个条件的处
  • linux查看openssl安装目录,linux如何使用openssl

    最近要做一个项目要用到openssl库 Linux里 无奈 xff0c 不得不安装openssl了 可是查了好多的资料都是一头雾水 xff0c 都不知道到底要是怎样才算是安装成功了 我的系统是 xff1a redhat xff0c 内核是
  • linux查看topic分区的数据量,如何查看Kafka的Topic消费情况

    温馨提示 xff1a 如果使用电脑查看图片不清晰 xff0c 可以使用手机打开文章单击文中的图片放大查看高清原图 Fayson的github xff1a https github com fayson cdhproject 提示 xff1a
  • AttackLab 这次我偷懒了

    这里有题解 xff0c 这里有题解 xff0c 这里有题解 迅速暴击上面一行 xff0c xff0c xff0c xff0c xff0c 感谢男神LJL 留几张图 第一次lab结束的时候还是12点之前 xff0c 感人 xff08 PS x
  • 与ajax相同的技术,AJAX是什么?都包含那些技术?

    AJAX的意思与包含的技术楼上的 亲 伱左脸 已经做出了回答了 xff0c 下面我就给你一点别的吧 xff0c 希望对你有所帮助 与传统的web应用比较 传统的web应用允许用户填写表单 form xff0c 当提交表单时就向web服务器发

随机推荐

  • asp网站 服务器iis 安全设置,Windows server 2008 R2 + IIS7.5,ASP网站设置

    1 让IIS7支持ASP Win2008 IIS7 默认不安装ASP xff0c 如果需要ASP 的支持 xff0c 需要将这个角色服务选上 2 相关设置 应用程序池 gt DefaultAppPool gt 高级设置 gt 启用32位应用
  • 服务器修改css,本地服务器修改css

    本地服务器修改css 内容精选 换一换 Windows Server 2012 R2操作系统弹性云服务器 xff0c 本地使用远程桌面连接功能连接云服务器并启用redirected drive功能时 xff0c 云服务器出现蓝屏 远程桌面连
  • RDS SQL Server 创建数据库关系图(Database Diagrams)

    背景介绍 SQL Server 关系图是一个非常简单易用且方便的工具 xff0c 可以直观的把数据库中表之间的关系展现出来 xff0c 不用手动整理或者写脚本整理各个表之间的关系 xff0c 如下图 RDS SQL Server 2008
  • MapReduce实战:自定义输入格式实现成绩管理

    1 项目需求 我们取有一份学生五门课程的期末考试成绩数据 xff0c 现在我们希望统计每个学生的总成绩和平均成绩 样本数据如下所示 xff0c 每行数据的数据格式为 xff1a 学号 姓名 语文成绩 数学成绩 英语成绩 物理成绩 化学成绩
  • 走心整理——十个常用深度学习算法

    十分抱歉 xff0c 由于项目太忙 xff08 我会说自己懒吗 xff1f xff09 柳猫一直没有更新自己的手记 xff0c 现在 xff0c 就让柳猫来讲讲十个常用的深度学习算法 过去十年里 xff0c 人们对机器学习的兴趣经历了爆炸式
  • Linux信号量操作次数的探究

    需求源于项目中一部分设计的代码 struct semaphore类型的信号量 xff0c 使用up 进行释放 xff0c down interruptible 和down 获得指定信号量 xff08 前者中 xff0c 若该信号量已争用则进
  • 编写简单的MapReduce程序(Hadoop2.2.0)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我们以简化版的气温统计为例 xff0c 演示如何开发一个MapReduce程序 Eclipse中新建一个MapReduce项目 xff0c 命名为MaxTemperatur
  • 【操作系统】trap,interrupt,和异常

    陷阱 计算机有两种运行模式 xff1a 用户态 xff0c 内核态 其中操作系统运行在内核态 xff0c 在内核态中 xff0c 操作系统具有对所有硬件的完全访问权限 xff0c 可以使机器运行任何指令 xff1b 相反 xff0c 用户程
  • PowerShell-数组的多种录入方法

    PS xff1a 这个需求是小骆驼发起的 感谢 微软云方案交流 236804566 这个高端群的用户贡献 我们首先看看一个标准的数组 是怎么录入的 PS D gt arr 61 34 adf 34 34 asdfer 34 34 sreds
  • vnc 端口修改、用户添加删除、批量启动停止

    2019独角兽企业重金招聘Python工程师标准 gt gt gt yum y install tiger server usr bin env bash config file 61 34 etc sysconfig vncservers
  • Docker命令详解

    最近学习Docker xff0c 将docker所有命令实验了一番 xff0c 特整理如下 xff1a docker help Usage docker OPTIONS COMMAND arg docker daemon help dock
  • rman备份rman-00554 ,rman-04005错误

    gt rman target 64 orac 到Oracle安装目录找到 network admin sqlnet ora文件 将SQLNET AUTHENTICATION SERVICES 61 NONE 修改为 SQLNET AUTHE
  • 码农学ODL之SDN入门篇

    本文作为码农学ODL系列的SDN基础入门篇 xff0c 分为两部分 第一部分 xff0c 主要讲述SDN是什么 xff0c 改变了什么 xff0c 架构是什么样的 xff0c 第二部分 xff0c 简要介绍如何去学习SDN 1 什么是SDN
  • CAS单点登录之mysql数据库用户验证及常见问题

    前面已经介绍了CAS服务器的搭建 xff0c 详情见 xff1a 搭建CAS单点登录服务器 然而前面只是简单地介绍了服务器的搭建 xff0c 其验证方式是原始的配置文件的方式 xff0c 这显然不能满足日常的需求 下面介绍下通过mysql数
  • 抽象类和接口的区别

    抽象类和接口的区别 一 抽象类 xff1a 抽象类是特殊的类 xff0c 只是不能被实例化 xff1b 除此以外 xff0c 具有类的其他特性 xff1b 重要的是抽象类可以包括抽象方法 xff0c 这是普通类所不能的 抽象方法只能声明于抽
  • 对本课程的期望

    希望自己能够通过对本课程的学习 xff0c 对C语言能有进一步的了解 xff0c 能够学会自主运用 xff0c 学习到经验技术和知识 xff0c 也希望老师能够在学习新知识时多讲解多运用 xff0c 反复练习 xff0c 以增加学生对新知识
  • 一篇文章带你搞懂JS对象的自我销毁

    在日常的JS组件开发中 xff0c 往往会有一些较为复杂的DOM操作及事件监听 xff0c 尤其是在处理UI层面的widgets时候更为明显 常常会花很多精力在对象的init上 xff0c 而当组件需要被移除时则仅仅是把所在DOM草草的re
  • LCA系列 hdu2587

    题http acm hdu edu cn showproblem php pid 61 2586 好久不写LCA了 span class hljs preprocessor include lt cstdio gt span span cl
  • AutoLISPDCL对话框设计

    AutoLISPDCL对话框设计 xff0c 代码如下 defun c viewdcl if null dcl pt setq dcl pt 39 1 1 setq dcl file getfiled 34 打开DCL文件 34 34 34
  • boost的asio接收单路大数据量udp包的方法

    开发windows客户端接收RTP视频流 xff0c 当h264视频达到1080P 60fps的时候 xff0c 按包来调用recvfrom的函数压力比较大 xff0c 存在丢包的问题 xff0c windows的完成端口的性能效果当然可以