asio网络库async_write()在linux和Windows下的小区别

公司一个小子开发的跨平台网络应用在linux下正常,在windows下就闹别扭了,帮忙解决之。发现可能犯的一个错误,记录一下。

0x00 现象

需要开发一个linux和windows下使用的一个网络程序,采用asio库,这个任务交给公司那小子来做吧,linux下写好了,都很正常。放到windows下刚打开没几秒就挂了,触发一个断言。

0x01 debug

查看调用堆栈,如下图所示:

170618_1twQ_148585.png

查看调用堆栈是io_service工作出现异常,调用路径经过:win_iocp_socket_send_op() -> buffer_debug_check();应该死发送数据时的buffer异常,凭经验判断可能是buffer生命周期没有管理好。

经检查代码果然是这样:要发送的数据作为async_write的参数,等async_write函数调用后数据的生命周期就立马结束了。

解决:在async_write完成的回调函数handle_write中结束数据的生命周期即可。

0x02 分析

为什么linux下正常而windows下异常呢?

因为linux下使用的io模型是epoll(reactor模型,当调用async_write时数据已经放到网卡驱动的缓冲区了),windows下采用iocp(调用async_write后数据可能还没有发送出去,而是在队列中等待,函数还是会立即返回,如果这时就把数据内存空间释放了,等真正发送数据的时候就异常了)。asio是proactor模型的,但linux是用epoll来模拟proactor模型的, 底层还是reatcor,所以碰巧不会出问题,但是那小子的用法确定是不正确的。

转载于:https://my.oschina.net/macwe/blog/285603

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值