Boost系列之asio库简易使用及遇到的问题(UDP)和思考

Boost系列之asio库简易使用及遇到的问题(UDP)

1、个人学习asio的一些步骤和看法

首先我都是直接文档怼上:Boost.Asio - 1.68.0

在看文档需要了解一下大概;

Overview - 1.68.0 (boost.org)Using Boost.Asio - 1.68.0理论部分居多,简单阅读可以了解asio的内部细节;

Tutorial - 1.68.0 (boost.org)Examples - 1.68.0 (boost.org)这两个章节主要讲解如何使用asio库;

Reference - 1.68.0 (boost.org)这个章节对我来说在开发应用打开最多的章节,里面包含了asio库API的方方面面,值得粗读和细读;

剩余章节没有细究;

2、我用到了哪些asio特性

  • io_context
  • buffer(异步读写)
  • ip::udp ip::endpoint socket属性操作
  • 以及部分timers内容

3、下面是使用asio作为udp-server的sample 片段代码

c++ 复制代码
void gvstream::CaptureMultiPartFrame() {
	m_receiver_socket.async_receive_from(
		boost::asio::buffer(m_message.data(), m_message.size()),
		m_tramitter_endpoint,
        // 由HandleMultipartMessage函数处理接收到的信息
		boost::bind(&aingvstream::HandleMultipartMessage, this,
			boost::asio::placeholders::error,
			boost::asio::placeholders::bytes_transferred)
	);
}

void gvstream::HandleMultipartMessage(const boost::system::error_code& err, size_t bytesTransferred) {
	char* multiPartPacket = new char[m_packet_size];
	memcpy(multiPartPacket, m_message.data(), bytesTransferred);
    // 详细解析收到的信息包
	uint64_t blockId = ProcessPacket(multiPartPacket, bytesTransferred);
    // 检测一个帧数据被拆分成多个packet后,server接收到packet组成帧的完整性
	CheckFrameCompletion(blockId);
    // 再次异步接收
	CaptureMultiPartFrame();
}

上面的片段是Asio-UDP-Server最精彩的桥段,使用异步接收的方式处理收到的消息,再通过回调函数再次异步接收。

4、问题和思考

问题:在代码片段注释里已经明确的说明了代码的意图。这时我们可以想到所有的异步接收实际上是同步处理(在HandleMultipartMessage 里调用CaptureMultiPartFrame ),那么对于UDP这种没有不稳定,不保证数据重传、正确性的协议,丢包时有发生;而且在上面的片段代码中,当client大量数据传输到server端时,丢包率极高。这是因为ProcessPacket 占据了大量的CPU时间,导致在新包到来时还没有调用CaptureMultiPartFrame从而导致丢包。

思考:这里的简单应用问题很多,往往需要自定义实现重传或直接TCP协议。再不然就是使用线程池+异步接收的方式实现降低丢包率甚至不丢包。这里都非常的繁琐,这是在windows层面我们可以使用系统自带的IOCP实现UDP-Server基本可以完美的解决问题,它内部使用线程池+消息队列的方式防止大量数据到来来不及处理的问题。

要想了解IOCP-UDP可以参考我的文章:https://blog.csdn.net/youzai2017/article/details/138321593

相关推荐
Irene199113 小时前
手机SIM卡 4G 5G 信号强度 和 移动网络 WIFI 之间的关系或区别
网络·5g·4g·sim卡
深信达沙箱14 小时前
SDC沙箱能够满足哪些场景需求?
网络·加密·软件·源代码·沙盒
在路上看风景14 小时前
08. Static
c++
郝学胜-神的一滴14 小时前
深入理解网络IP协议与TTL机制:从原理到实践
linux·服务器·开发语言·网络·网络协议·tcp/ip·程序人生
松涛和鸣14 小时前
DAY61 IMX6ULL UART Serial Communication Practice
linux·服务器·网络·arm开发·数据库·驱动开发
程序猿_极客17 小时前
【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)
java·开发语言·windows·macos·jdk
一个不知名程序员www20 小时前
算法学习入门 --- 哈希表和unordered_map、unordered_set(C++)
c++·算法
上海云盾商务经理杨杨20 小时前
2026游戏盾深度解析:从被动防御到智能作战,构建DDoS免疫堡垒
网络·游戏·ddos
C++ 老炮儿的技术栈20 小时前
在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
c语言·c++·windows·git·vscode·visual studio
强子感冒了20 小时前
Java网络编程学习笔记,从网络编程三要素到TCP/UDP协议
java·网络·学习