在网络通信中,我个人比较喜欢异步的方式。这样我程序就不会因为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;