win32下boost::asio进一步封装

本文介绍了如何在Win32环境下利用Boost.Asio库进行网络通信的异步封装,通过事件通知机制避免线程阻塞。在主线程中,通过调用特定函数启动异步操作,并在辅助线程中执行io_service的run方法。为确保线程安全和回调函数在主线程执行,利用SendMessage进行消息传递。文章详细展示了相关代码实现,包括连接、发送、接收的处理函数以及超时设置和连接信息的获取。
摘要由CSDN通过智能技术生成

在网络通信中,我个人比较喜欢异步的方式。这样我程序就不会因为I/O的读写而导致线程阻塞。理想的工作方式是通知窗口的事件通知。windows中socket的底层其实是支持窗口事件通知的,但由于boost库比较强大,我就基于asio的库来实现这样的机制。

由于是异步方式,当事件处理完成后,我希望将结果传递给回调函数,因此类中有下面3个函数:

    virtual void handler_connect(const boost::system::error_code& error);
    virtual void handler_send(const boost::system::error_code& error);
    virtual void handler_receive(const boost::system::error_code& error);

参数传递过来的只是是否有错误。

在主线程中,我只需要调用

复制代码
void connect();

template<typename ConstBufferSequence>
void send(const ConstBufferSequence& buffers);

template<typename MutableBufferSequence>
void receive(const MutableBufferSequence& buffers)
复制代码

这三个函数即可,处理完成后会自动调用上面的回调函数,使用回调函数来处理结果。

 

asio中io_service的run会一直阻塞线程,所以需要将run在辅助线程中运行,但这样的话,回调函数就会在辅助线程中执行,为了保证线程安全性和消除MFC中不同线程执行后的代码异常,我需要将回调函数转入main线程中执行,这就应用了SendMessage函数了通知主线程窗口,下面详细的代码:

复制代码
#define WM_ASIO_MESSAGE (WM_USER + 1)

using boost::asio::ip::tcp;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值