asio socket::close时异步操作的处理

boost.asiosocket异步关闭流程 boost.asio中的socket异步方法,需要检测std::error_code来关闭连接,那如何正常关闭tcp连接呢。下面的模拟测试中: 1.server端在读取client端发送的第一个1024字节流后,关闭连接。 2.client端在另一个线程发送第一个1024字节流后,sleep1秒,再发送第二个1024字节流。 结果: 1.server端在关闭socket后,其异步方法会检测到错误。 2.client端的第二次发送也会检测到错误。 所以通过正常的错误处理,两端可以及地关闭tcp连接。 可以得 阅读详情

asio中socket通常的用法如

 

如果此时外界调用了Session::Close又删除了该对象,已经由async_read注册的HandleRead并不会被立即取消,而是会再次被调用,并把error_code设置成operation_aborted。那么在HandleRead里的delete this就会重复删除对象造成崩溃。

如果把HandleRead改成

static void HandleRead(shared_ptr<Session> session, ...)

或者weak_ptr然后检测是否已经expired,可以解决问题,但是由于智能指针占用空间比原生指针大,会在Read()中的boost::bind一句里造成动态内存分配(见此文),造成效率急剧下降。

最终的解决方案:手动去记录有多少异步操作被注册,关闭socket时只有当计数减少到0才销毁对象。

[Boost基础]并发编程——asio网络库——异步socket处理 异步服务器端 #include #include using namespace std; #include #include #include using namespace boost; using namespace boost::asio; void test1(){} //异步server //异步程序的处理流程与同步程序基本相同,只需要把原有的同步调用函数都换成前缀是asy 阅读详情

相关推荐

深入解析boost.asiosocket异步关闭的线程安全与资源释放

本文深入探讨了在Boost.Asio中实现socket异步关闭的线程安全与资源释放难题。文章剖析了close()、shutdown()与cancel()的核心区别,揭示了多线程环境下因竞态条件导致的程序崩溃与内存泄漏风险,并提供了基于shared_ptr智能指针、状态标志及strand执行器的系统性解决方案与最佳实践清单,确保异步操作安全终止与资源有序释放。

life6的博客 306

ROS Serial相关失误总结

1、连接失败 Client Failed to receive data from server 10054 Failed to receive data from server 10054 Failed to receive data from server 10054 Send failed with error 10054 Failed to receive data from server 10093 Failed to receive data from server 10093 Failed

参谋谋的博客 1891

深入解析boost.asio中TCP socket异步关闭机制与错误处理

本文深入解析了Boost.Asio中TCP socket异步关闭机制与错误处理实践。异步关闭并非瞬间动作,而是通过取消未完成操作并触发回调的过程。文章详细探讨了socket.close()的内部行为、常见错误码(如operation_aborted)的处理策略,并针对多线程环境提出了利用io_context串行化的安全关闭模式,帮助开发者构建健壮的高性能网络应用。

weixin_29215815的博客 62

BOOST::ASIO多线程下socket关闭导致进程崩溃问题定位及解决

背景:         本系统为我公司开发的一套商用车车联网系统的网关子系统,采用C++基于BOOST库开发,网络开发库采用了BOOST的ASIO库,线程池采用了基于BOOST的ThreadPool库。         本次问题中涉及两个线程在不同刻对同一个SOCKET操作,这两个线程分属不同的类。 现象:     系统接入实车进行测试后,在某些场景开会在read发生异常,或直接

jack_chen99的专栏 6022

boost::asio异步调用-socket.close引起崩溃

boost意外崩溃问题调查

IT旅途 1360

boost::asio要注意的一个地方

asio是在多线程环境里运行的,他所绑定的用户所传递的回调函数也是在多线程里运行。在asio线程外对asio里函数的调用(比如close) 要放到asio线程里调用,方法就是用post。

fengge_ylf的专栏 1448

Boost.Asio实战:如何优雅地处理TCP socket异步关闭(附线程安全示例)

本文深入探讨了使用Boost.Asio库实现TCP socket异步关闭的最佳实践,提供了线程安全的完整解决方案。通过状态同步、错误码处理和strand应用,解决了资源竞争和多次关闭等常见问题,并附有详细的代码示例和优化技巧,帮助开发者构建健壮的网络应用。

weixin_28725553的博客 203

基于Boost.Asio的C++异步网络服务器开发实战指南

网络编程中的并发与I/O处理是构建高性能服务的关键挑战。传统同步阻塞模型存在资源消耗大、性能瓶颈明显的问题,而原生异步API如epoll和IOCP虽然高效但跨平台兼容性差。Boost.Asio库通过前摄器模式抽象了底层I/O复用机制,提供了统一的异步编程接口,使开发者能够编写高性能、可扩展的网络应用。其核心价值在于简化了异步操作的生命周期管理,通过io_context实现事件循环调度,结合智能指针管理连接会话,有效解决了C10K等高并发场景下的连接管理难题。在工程实践中,Boost.Asio广泛应用于游戏服

weixin_33816946的博客 1059

Boost.Asio踩坑记录:TCP连接异步关闭的5个常见误区与解决方案

本文深入探讨了使用Boost.Asio进行TCP连接异步关闭的5个常见误区与解决方案,包括错误处理、资源释放、线程安全、关闭顺序和超控制。通过实际案例和代码示例,帮助开发者避免在异步I/O编程中遇到的隐蔽陷阱,提升网络应用的稳定性和性能。

weixin_29303701的博客 233

boost asio中关闭io_service和关闭…

asio的示例程序,发现有两种常见的关闭方式,io_service.stop()和socket.close()。reference里面只是寥寥几句,没有满足我的好奇心,于是自己动手测试。     io_service.stop():终止io_service的事件循环,所以io_service上所有socket注册的异步事件都取消了(不会再被触发),io_service.run()返回。    

runyon的博客 6503

基于Boost.Asio异步TCP服务器设计:解决粘包与连接管理

在网络编程中,异步I/O模型是实现高性能服务器的关键技术,它通过非阻塞操作和事件驱动机制,有效提升并发处理能力。其核心原理在于利用操作系统提供的I/O多路复用机制,在单线程内管理大量连接,避免为每个连接创建独立线程带来的资源开销。这一技术价值在于能够构建高吞吐、低延迟的网络服务,广泛应用于游戏服务器、实通信、金融交易等场景。针对TCP流式协议固有的粘包/拆包问题,以及空闲连接导致的资源泄漏,需要设计健壮的解决方案。本文通过引入定长消息头解析器和心跳超机制,结合Boost.Asio库,详细阐述了如何构建一

weixin_30745553的博客 418

ASIO异步通信——多线程模型

为了提升网络io并发处理的效率,设计多线程模式下asio的使用方式。总体来说asio有两个多线程模型,第一个是启动多个线程,每个线程管理一个iocontext。第二种是只启动一个iocontext,被多个线程共享。

2502_93606049的博客 583

C++ Asio网络编程错误处理全解析:从基础机制到高级实践

在C++高性能网络编程中,错误处理是构建健壮系统的基石。其核心机制通常围绕错误码和异常两种模式展开,错误码提供同步与异步场景下的通用、无抛出的错误传递方式,而异常则适用于简化复杂同步逻辑的错误处理流程。从技术价值看,合理的错误处理策略能显著提升程序的容错性、可维护性和可观测性,是保障服务稳定运行的关键。在异步事件驱动的网络应用中,错误处理尤其重要,它需要与连接生命周期管理、超控制、资源管理等核心机制紧密结合。本文聚焦于Asio库,深入探讨其错误码与异常的双重机制、异步回调中的错误传递模式,并结合连接管理、

weixin_33720078的博客 314

socket close shutdown 点滴

socket中关闭套接字的函数close和shutdown区别 socket关闭close和shutdown socket关闭有2个close,shutdown 他们之间的区别: close-----关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id shutdown--则

yanziguilai的专栏 1278

基于Boost.Asio的C++异步TCP服务器与客户端开发实战

网络编程是构建高性能服务端应用的核心技术,其底层原理依赖于操作系统提供的Socket接口进行数据传输。异步I/O模型通过非阻塞调用和事件驱动机制,允许单线程高效处理大量并发连接,显著提升系统吞吐量和资源利用率。Boost.Asio作为C++领域成熟的跨平台网络库,封装了底层异步I/O细节,提供了直观的面向对象接口,极大简化了高并发网络程序的开发复杂度。在游戏服务器、金融交易、物联网等实性要求高的应用场景中,基于事件循环的异步架构能够有效应对海量连接与高频数据交换的挑战。本文通过一个完整的TCP通信实例,深

weixin_30326515的博客 350

C++网络编程实战:Boost.Asio异步模型与套接字编程详解

网络编程是构建分布式系统和网络应用的核心技术,其核心在于高效处理多并发连接与I/O操作。传统阻塞式套接字编程在应对C10K等高并发场景面临性能瓶颈,因此异步I/O与事件驱动模型成为现代高性能网络框架的基石。Boost.Asio作为C++领域广泛使用的跨平台网络库,通过封装epoll、IOCP等系统级异步机制,提供了统一的Proactor模式接口,实现了真正的非阻塞I/O。其技术价值在于允许单线程或线程池高效管理海量连接,极大提升了程序的吞吐量与资源利用率,广泛应用于游戏服务器、金融交易系统、实通信等高性

weixin_30751947的博客 374

Boost.Asio网络编程实战:从异步I/O到高性能服务器开发

网络编程是构建分布式系统的核心技术,其核心挑战在于高效处理并发连接与I/O操作。传统基于线程的同步模型在连接数增多面临性能瓶颈,而异步I/O模型通过事件驱动机制,允许单线程处理大量并发连接,显著提升系统吞吐量。Boost.Asio作为C++领域事实标准的异步I/O库,基于前摄器模式实现,将底层操作系统I/O操作抽象为异步任务,通过io_context调度器统一管理回调执行。该技术价值在于以清晰的异步模型实现高性能网络服务,避免线程切换开销,广泛应用于游戏服务器、实通信、金融交易等高性能场景。本文通过TC

weixin_30920597的博客 455
上一篇: boost::bind效率上的注意事项
下一篇: 整合protobuf、boost::iostreams和NetMessage类
cometeor
博客等级 码龄18年 71粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值