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

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

0x00 现象

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

0x01 debug

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

asio网络库async_write()在linux和Windows下的小区别_第1张图片

查看调用堆栈是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,所以碰巧不会出问题,但是那小子的用法确定是不正确的。

你可能感兴趣的:(asio网络库async_write()在linux和Windows下的小区别)