国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ boost::asio編程-異步TCP詳解及實例代碼

2020-05-23 13:58:58
字體:
來源:轉載
供稿:網友

C++ boost::asio編程-異步TCP

大家好,我是異步方式

和同步方式不同,我從來不花時間去等那些龜速的IO操作,我只是向系統說一聲要做什么,然后就可以做其它事去了。如果系統完成了操作, 系統就會通過我之前給它的回調對象來通知我。
在ASIO庫中,異步方式的函數或方法名稱前面都有“async_ ” 前綴,函數參數里會要求放一個回調函數(或仿函數)。異步操作執行 后不管有沒有完成都會立即返回,這時可以做一些其它事,直到回調函數(或仿函數)被調用,說明異步操作已經完成。

在ASIO中很多回調函數都只接受一個boost::system::error_code參數,在實際使用時肯定是不夠的,所以一般 使用仿函數攜帶一堆相關數據作為回調,或者使用boost::bind來綁定一堆數據。

另外要注意的是,只有io_service類的run()方法運行之后回調對象才會被調用,否則即使系統已經完成了異步操作也不會有任 務動作。

好了,就介紹到這里,下面是我帶來的異步方式TCP Helloworld服務器端:

// BoostTcpServer.cpp : 定義控制臺應用程序的入口點。 //  #include "stdafx.h" #include "boost/asio.hpp" #include "boost/shared_ptr.hpp" #include "boost/thread.hpp"  using namespace std; using namespace boost::asio;  #ifdef _MSC_VER #define _WIN32_WINNT  0X0501 //避免VC下編譯警告 #endif  #define PORT 1000 #define IPV6 //#define IPV4  class AsyncServer { public:   //構造函數   AsyncServer(io_service &io,ip::tcp::endpoint &ep):ios(io),acceptor(io,ep)   {     //acceptor(ios,ep);     start();   }   //啟動異步接受客戶端連接   void start()   {     sock_ptr sock(new ip::tcp::socket(ios));     //當有連接進入時回調accept_handler函數     acceptor.async_accept(*sock,       boost::bind(&AsyncServer::accept_handler,this,placeholders::error,sock));   } private:   io_service &ios;   ip::tcp::acceptor acceptor;   typedef boost::shared_ptr<ip::tcp::socket> sock_ptr;    void accept_handler(const boost::system::error_code &ec, sock_ptr sock)   {     if(ec)        return;     //輸出客戶端連接信息     std::cout <<"remote ip:"<<sock->remote_endpoint().address()<<endl;     std::cout <<"remote port:"<<sock->remote_endpoint().port() << std::endl;     //異步向客戶端發送數據,發送完成時調用write_handler     sock->async_write_some(buffer("I heard you!"),       bind(&AsyncServer::write_handler,this,placeholders::error));     //再次啟動異步接受連接     start();   }    void write_handler(const boost::system::error_code&)   {     cout<<"send msg complete!"<<endl;   } };  int _tmain(int argc, _TCHAR* argv[]) {   try   {     //定義io_service對象     io_service ios;     //定義服務端endpoint對象(協議和監聽端口) #ifdef IPV4     ip::tcp::endpoint serverep(ip::tcp::v4(),PORT); #endif  #ifdef IPV6     ip::tcp::endpoint serverep(ip::tcp::v6(),PORT); #endif     //啟動異步服務     AsyncServer server(ios, serverep);     //等待異步完成     ios.run();   }   catch (std::exception& e)   {     cout<<e.what()<<endl;   }   return 0; } 

客戶端一般無需采用異步方式,同同步方式即可。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永平县| 吉木乃县| 金昌市| SHOW| 神池县| 安龙县| 临猗县| 依安县| 榕江县| 元阳县| 兴化市| 北流市| 临夏市| 宝丰县| 上思县| 桑日县| 闸北区| 塔河县| 华坪县| 保康县| 蕉岭县| 息烽县| 赤城县| 通城县| 江油市| 丹寨县| 拉萨市| 涟源市| 靖远县| 锦州市| 永年县| 布尔津县| 文化| 宁乡县| 商河县| 武清区| 伊春市| 紫金县| 广元市| 琼海市| 平罗县|