boost.asio异步调用使用智能指针

2023-05-16

boost.asio中的异步async_*函数需要传入回调函数参数,如果回调函数使用lamda表达式,在’capture’列表中传入智能指针,智能指针会生效吗?
在async_connect调用之前,我们创建一个shared_ptr对象,并以值传入的形式放到lamda的’caputer’列表中,最后发现shared_ptr在async_connect的异步回调函数完成后析构了其管理的对象,可见其是生效的。
其实最好还是用uinque_ptr,但lamda中不支持move捕获。
测试代码如下:

class LIBTEST_BOOST_DLL TcpServer
{
public:
	typedef  boost::asio::ip::tcp::socket tcp_socket_t;
	typedef  boost::asio::ip::tcp::acceptor tcp_acceptor_t;
	typedef  boost::asio::ip::tcp::endpoint tcp_endpoint_t;
	typedef  boost::asio::io_context io_context_t;
	TcpServer(io_context_t &io, const tcp_endpoint_t& endpoint);
	void Accept();
	void ReadHandler(tcp_socket_t *sock);
private:
	tcp_acceptor_t acceptor_;
	io_context_t *io_;
	uint64_t cnt_ = 0;
};
class LIBTEST_BOOST_DLL TcpClient
{
public:
	typedef  boost::asio::ip::tcp::socket tcp_socket_t;
	typedef  boost::asio::ip::tcp::endpoint tcp_endpoint_t;
	typedef  boost::asio::io_context io_context_t;
	TcpClient(io_context_t &io);
	void Connect(const tcp_endpoint_t& endpoint);
	void Write();
private:
	tcp_socket_t sock_;
	io_context_t  *io_;
	uint64_t cnt_ = 0;
};
TcpServer::TcpServer(io_context_t &io, const tcp_endpoint_t& endpoint)
	:acceptor_(io,endpoint),io_(&io)
{

}
void TcpServer::ReadHandler(tcp_socket_t *sock)
{
	char *buf = new char[1024];
	sock->async_read_some(boost::asio::buffer(buf,1024), [sock, this,buf](const std::error_code &ec, std::size_t sz) {
		delete buf;
		if (ec) {
			sock->close();
			cout << "[threadId=" << this_thread::get_id() << "] " <<  "async_read_some callback error,msg=" << ec.message()<< endl;
			delete sock;
			return;
		}
		//cout << "[" << this_thread::get_id() << "] " << &buf_[0];// << endl;
		cnt_++;
		cout << "[threadId=" << this_thread::get_id() << "] " << "async_read_some callback cnt=" << cnt_ << ",size=" << sz << endl;
		ReadHandler(sock);
		sock->close();
		sock->close();
		sock->close();
	});
}
void TcpServer::Accept()
{
	
	//auto sock = make_shared<tcp_socket_t>(*io_);
	auto sock = new tcp_socket_t(*io_);
	auto acceptHandler = [this,sock](const std::error_code &ec) {
		if (ec) {
			delete sock;
			cout << "[threadId=" << this_thread::get_id() << "] " << "async_accept callback error,msg=" << ec.message() << endl;
			return;
		}
		cout << "[threadId=" << this_thread::get_id() << "]";
		cout << " async_accept callback client from: ";
		cout << sock->remote_endpoint().address() <<":" << sock->remote_endpoint().port() << endl;
		ReadHandler(sock);
		Accept();
	};
	acceptor_.async_accept(*sock, acceptHandler);

}

TcpClient::TcpClient(io_context_t &io)
	:sock_(io),io_(&io)
{
}
void TcpClient::Write()
{
	auto buf = new char[1024];
	memset(buf,'q',1024);
	sock_.async_write_some(boost::asio::buffer(buf,1024), [this,buf](const std::error_code &ec, std::size_t sz) {
		delete buf;
		if (ec) {
			cout << "[threadId=" << this_thread::get_id() << "] " << "async_write_some callback error,msg=" << ec.message() << endl;
			sock_.close();
			return;
		}
		cnt_++;
		cout << "[threadId=" << this_thread::get_id() << "] " << "async_write_some callback cnt=" << cnt_ << ",size=" << sz<< endl;
	});
	
}
class Test {
public:
	~Test() { cout << "Test destructor" << endl; }
};
typedef std::shared_ptr<Test> mc_ptr_t;
void GiveMeOwership(mc_ptr_t ptr)
{
	cout << "hello,world" << endl;
}
void TcpClient::Connect(const tcp_endpoint_t& endpoint)
{
	auto ptr = mc_ptr_t(new Test());
	//async func will also increase the `user` of shared_ptr
	auto connHandler = [this, endpoint,ptr](const std::error_code &ec) {
		if (ec) {
			cout << "[threadId=" << this_thread::get_id() << "] " << "async_connect callback error,msg=" << ec.message() << endl;
			//Connect(endpoint);
			return;
		}
		cout << "[threadId=" << this_thread::get_id() << "] ";
		cout << "async_connect callback to ";
		cout << this->sock_.remote_endpoint().address();
		cout << " success" << endl;;
		std::thread t([this](){
		//1000000
			for(int i=0;i<1;i++)
			Write();
		});
		t.detach();
	};
	sock_.async_connect(endpoint, connHandler);
}
int main(int argc, char *argv[])
{
	//auto ptr = mc_ptr_t(new Test);
	//GiveMeOwership(std::move(ptr));
#if 1
	boost::asio::io_context io;
	
	boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 1234);
	TcpServer tcp(io,endpoint);
	TcpClient client(io);
	tcp.Accept();
	client.Connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"),1234));
	boost::asio::io_context::work worker(io);
	io.run();
#endif
	
#ifdef WIN32
	system("pause");
#endif
	return 0;
}

输出如下:
output

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

boost.asio异步调用使用智能指针 的相关文章

  • python tcping(ping命令)

    python tcping xff08 ping命令 使用tcping库中的ping方法使用如下 xff1a span class token keyword from span tcping span class token keywor
  • RecycledViewPool的使用和堆内存分析

    RecycledViewPool在 ViewPager 43 RecyclerView的场景下可以大放光彩 下面就来验证一下它的优点 xff1a 首先我们自定定义一个View放在ViewHolder中 xff1a public class
  • SX1261/2芯片开发那些事儿(一)时钟源选择

    相信大家第一次接触LoRa芯片时 阅读Semtech官方Demo代码或者自己进行项目开发时 xff0c 不知道对于待机模式 xff0c 是使用STDBY RC还是STDBY XOSC呢 xff1f 今天我们就来介绍射频芯片SX1261 2该
  • 解决Ubuntu20.04安装ROS过程镜像源问题

    解决Ubuntu20 04安装ROS过程镜像源问题 问题背景问题描述解决方案参考链接 问题背景 我是先安装了 Windows10 子系统 WSL wsl install 并安装Ubuntu20 04 wsl install d Ubuntu
  • 解决 qt.qpa.xcb: could not connect to display 问题

    2022 07 21更新 现在WSL2已经可以直接运行 Linux GUI 了 xff01 xff01 xff01 不再需要安装Xserver xff08 XLaunch xff09 之类的 xff01 xff01 xff01 参考微软的官
  • 解决在VScode中调试C++代码断点无效、断点错位的问题

    问题背景 最近在学习高翔博士的经典教程 视觉SLAM十四讲 xff08 第2版 xff09 xff0c 使用其配套的Github中C 43 43 代码进行学习 xff0c 在调试时发现断点无效 错位的问题 xff0c 查阅了一些资料 xff
  • Ubuntu系统安装在移动固态硬盘,实现在不同电脑即插即用

    Ubuntu系统安装在移动固态硬盘 xff0c 实现在不同电脑即插即用 一 前期准备二 制作系统启动盘2 1 Ubuntu20 04系统下载2 2 制作U盘启动盘 三 磁盘分区 xff08 重点 xff09 四 Ubuntu系统安装 xff
  • 详解C/C++代码的预处理、编译、汇编、链接全过程

    1 C C 43 43 运行的四个步骤 编写完成一个C C 43 43 程序后 xff0c 想要运行起来 xff0c 必须要经过四个步骤 xff1a 预处理 编译 汇编和链接 每个步骤都会生成对应的文件 xff0c 如下图所示 xff08
  • VSCode调试C++代码的多种方案

    以下内容均针对 Linux 操作系统 xff08 包括Windows的Linux子系统WSL2 xff09 本文是对Linux系统中使用VSCode编译调试C 43 43 代码的系列文章的总结 xff0c 前面三篇文章如下 xff1a 详解
  • 【ROS】rostopic常用命令

    记录ROS查看话题的常用命令 xff1a rostopic 查看节点列表 xff1a rostopic list 查看节点信息 xff0c 如相机节点的内参K矩阵 畸变D矩阵 分辨率等等 rostopic echo camera camer
  • 【ROS笔记】设置、修改ROS环境变量

    ROS设置环境变量 ROS安装到Ubuntu后 xff0c 默认在 opt路径下 xff0c 由于在使用过程中需要频繁在终端使用ROS命令 xff0c 需要对其环境变量进行设置 Ubuntu默认使用终端为bash xff0c 在bash中设
  • 【ROS笔记】工作空间(workspace)、功能包(package)的介绍及创建

    初接触ROS时 xff0c 对其文件结构容易产生困惑和混淆 xff0c 比如 catkin ws到底是什么 xff1f catkin ws src目录下存放的是什么 xff1f catkin ws src路径下怎么还会有其他的src 目录
  • RecyclerView中倒计时item的优雅方案

    本文介绍在RecyclerView中使用倒计时楼层 xff0c 并且每秒刷新显示倒计时 没有纠结于样式 xff0c 主要介绍代码结构和设计模式 先看一下效果 xff1a 我们采取的是观察者模式的方法 xff0c 启动一个handler xf
  • bluerov

    ov这个东西其实不难 xff0c 比较麻烦的是密封 xff0c 防水等工作 xff0c 而非一些技术性工作 xff08 所谓技术性工作就是算法 xff0c 人工智能等 xff09 现在供玩家玩的Rov xff0c 基本模式是这样的 xff0
  • 在线教程 | 用「网红项目」DeepSOCIAL 进行社交距离监测

    首发自 xff1a 公众号 HyperAI超神经 内容一览 xff1a YOLO v4 是一个实时的 高精度的目标检测模型 xff0c 本教程将详细讲解如何基于 YOLO v4 和 SORT 算法 xff0c 实现在多目标条件下的人群距离检
  • C#实现服务端/客户端的tcp异步通信完整示例

    demo 通过一个简单的demo xff0c 实现服务器和客户端之间的tcp异步通信 消息进行了Des加密和解密 运行动图如下 xff1a 图中有三个程序在运行 xff0c 最左边是服务端 xff0c 另外两个是客户端 xff0c 客户端可
  • C++封装HTTP

    C 43 43 封装HTTP Client 简介HTTP请求头封装HTTP请求头基本格式post请求头封装post请求头 HTTP Client 以及HTTP Server交互HTTP消息解析TCP封装HTTP Client的坑 Trans
  • android 自定义多功能进度条

    自定义进度条 xff0c 直接在布局文件里传入颜色值 xff0c 不用自己再去写样式 xff0c 还可以 效果图 xff1a git地址
  • 树莓派L298N电机驱动程序连接图文教程

    手里有一块树莓派3闲置很久 xff0c 不知干点啥好呢 看到不少网友用树莓派做智能小车 xff0c 好像很好玩的酱紫 xff0c 就到淘宝买了一些配件 对于硬件小白的我来说安装过程并不轻松 xff0c 网上看了很多资料但有的地方介绍的并不很
  • 一个比较好用的socket 类封装(封装http 请求)

    name myhttp h function http 请求 copyright author mark date 2008 05 13 ifndef MY HTTP INCLUDE define MY HTTP INCLUDE inclu

随机推荐

  • Odroid U3 烧写镜像文件

    在Ubuntu下往Odroid U3板子的eMMC卡里烧写xubuntu镜像文件 xff0c 主要步骤如下 xff1a 1 下载要烧写的镜像文件 xff0c 按照需要 xff0c 我下载的是桌面版的xubuntu 13 04 desktop
  • 解决odroid-XU3的HDMI输出问题

    odroid XU3的板子直接通过microHDMI口连接显示器 xff0c 并没有显示 解决方法是修改 media boot boot ini文件 xff0c 取消屏蔽与HDMI设置相关语句 重启之后 xff0c 解决问题 由于不同的显示
  • 现有的 TypeRef 应有对应的 TypeDef(Impl),但它没有

    现有的 TypeRef 应有对应的 TypeDef Impl xff0c 但它没有 本人需要在C 中调用C 43 43 代码 xff0c 故而建立了一个CLR项目 xff0c 建立了四个文件 xff0c 分别是两个纯C 43 43 文件 C
  • [zed2i] 相机内参数获取

    内置对应的程序 xff1a 双目SDK校正方法 关灯避免反射 xff0c 使得房间的灯光尽可能的黑 xff0c 拿着相机对准屏幕的标定板 xff08 可以不关灯 xff09 开始校正 xff0c 红圈是目标 xff0c 需要移动蓝圈 xff
  • Unity 2D独立开发手记(八):基于A*算法的简易寻路

    被生活 43 43 了一个多月 xff0c 都没时间上来吹比了 因为破游戏准备设计敌人了 xff0c 苦于Unity自带的导航系统迟迟不适配2D项目 xff0c 即便用最新的NavMeshSurface把3D当成2D来用 xff0c 也和我
  • 新建keil工程每一个文件夹的作用

    问 xff1a 头文件stm32f10x sdio c的作用 xff1f 有时候在添加路径的时候为什么不添加src xff1f 有些工程里就添加了 新建工程的每一个文件夹的作用 core xff0c obj xff0c STM32 FWLI
  • VScode使用时常见问题

    写在篇首 xff0c vscode各种蜜汁bug xff0c 记录一下解决方案供大家参考 1 无法使用C 43 43 万能头文件 include xff1c bits stdc 43 43 h xff1e 解决方案 在刷题的时候 xff0c
  • Socket网络编程总结

    网络中进程之间如何通信 Java最初是作为网络编程语言出现的 xff0c 其对网络提供了高度的支持 xff0c 使得客户端和服务器的沟通变成了现实 xff0c 而在网络编程中 xff0c 使用最多的就是Socket 像大家熟悉的QQ MSN
  • linux tcp并发式服务器应用SELECT函数编写实例源代码(转载)

    include lt stdio h gt include lt stdlib h gt include lt unistd h gt include lt errno h gt include lt string h gt include
  • Activity启动模式与任务栈(Task)、TaskAffinity应用场景【转】

    转载请注明出处 xff08 谢谢 xff09 xff1a Activity启动模式与任务栈 Task 全面深入记录 xff08 下 xff09 activities waiting to finish 任务栈 zejian 的博客 CSDN
  • VsCode技巧快捷键

    按住Alt 43 鼠标点击可以有多处光标同时编辑 快速显示大纲 相当于eclipse的打开当前类方法列表弹框 gt 设置为Alt 43 D 搜索go to symbol in File 设置即可 vscode设置匹配花括号跳转 Ctrl 4
  • jmeter察看结果树的响应数据时显示乱码

    找到jmeter的安装路径 xff08 即解压路径 xff09 打开apache jmeter 4 0 bin jmeter properties文件 搜索 encoding 关键字 xff0c 找到如下配置 xff1a The encod
  • class 和 struct的区别

    class 和 struct 最本质的区别 class 是引用类型 xff0c 它在堆中分配空间 xff0c 栈中保存的只是引用 xff1b 而 struct 是值类型 xff0c 它在栈中分配空间 什么是class class xff08
  • 第一周——总体了解STM32以及开发环境搭建

    什么是STM32 意法半导体 xff08 ST xff09 集团于1988年6月成立 xff0c 是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成 STM32系列基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的AR
  • 【ros下激光雷达的简单使用】(1)

    雷达简单使用方法 xff1a 思蓝科技S2的激光雷达 查看硬件是否连接成功 xff1a 使用lsusb wpf 64 wpfpc lsusb Bus 002 Device 001 ID 1d6b 0003 Linux Foundation
  • AMD CPU 电脑突然画面声音突然卡顿,卡碟声,画面撕裂

    有时候会突然卡顿个一两秒 xff0c 然后自己好 xff0c 如果主板买的早 xff0c 没更新过BIOS版本 xff0c 可能是因为AMD的fTPM设置有个BUG xff0c 开启之后有概率会随机卡顿 xff0c 各大厂商最新的主板驱动应
  • STL —— vector,list,deque,使用与优缺点比较

    关于vector list deque 已经做过介绍 xff0c 本文是对三种容器的优劣做出比较 下面是vector list deque的博客链接 vector list deque vector list对比 底层结构 动态顺序表 xf
  • android手机版tcp或者udp通讯测试工具,可以用于工业设备或者系统开发时间测试tcp或是udp连接通讯是否正常工作

    TUtool 介绍 由于工作需要一款安卓的tcp udp测试工具 xff0c 而市场里没有或者不好用 xff0c 或者都是广告 xff0c 现在个人开发者又不让发布应用了 xff0c 小巧好用不收集用户信息的不收费没有广告的小工具只能自己用
  • microhard p900数传配置方法

    配置好的两个 xff08 多个 xff09 数传电台可以通过串口直接相互通讯 xff0c 两个 xff08 多个 xff09 数传之间无线连接 数传电台可以配置多种通讯方式 xff1a 点对点 点对多 mesh组网 xff08 电台数量 2
  • boost.asio异步调用使用智能指针

    boost asio中的异步async 函数需要传入回调函数参数 xff0c 如果回调函数使用lamda表达式 xff0c 在 capture 列表中传入智能指针 xff0c 智能指针会生效吗 xff1f 在async connect调用之