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

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

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

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

boost::asio編程-同步TCP

boost.asio庫是一個跨平臺的網絡及底層IO的C++編程庫,它使用現代C++手法實現了統一的異步調用模型。

boost.asio庫支持TCP、UDP、ICMP通信協議。

下面介紹同步TCP模式:

大家好!我是同步方式!

我的主要特點就是執著!所有的操作都要完成或出錯才會返回,不過偶的執著被大家稱之為阻塞,實在是郁悶~~(場下一片噓聲),其實這樣 也是有好處的,比如邏輯清晰,編程比較容易。

在服務器端,我會做個socket交給acceptor對象,讓它一直等客戶端連進來,連上以后再通過這個socket與客戶端通信, 而所有的通信都是以阻塞方式進行的,讀完或寫完才會返回。

在客戶端也一樣,這時我會拿著socket去連接服務器,當然也是連上或出錯了才返回,最后也是以阻塞的方式和服務器通信。
有人認為同步方式沒有異步方式高效,其實這是片面的理解。在單線程的情況下可能確實如此,我不能利用耗時的網絡操作這段時間做別的事 情,不是好的統籌方法。不過這個問題可以通過多線程來避免,比如在服務器端讓其中一個線程負責等待客戶端連接,連接進來后把socket交給另外的線程去 和客戶端通信,這樣與一個客戶端通信的同時也能接受其它客戶端的連接,主線程也完全被解放了出來。

我的介紹就有這里,謝謝大家!

同步方式示例代碼:

服務器端

// BoostTcpServer.cpp : 定義控制臺應用程序的入口點。 //  #include "stdafx.h" #include "boost/asio.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  int _tmain(int argc, _TCHAR* argv[]) {   // 所有asio類都需要io_service對象   io_service iosev;    //創建用于接收客戶端連接的acceptor對象 #ifdef IPV4   ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), PORT)); #endif  #ifdef IPV6   ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v6(), PORT)); #endif    while (true)   {     // socket對象     ip::tcp::socket socket(iosev);     // 等待直到客戶端連接進來     acceptor.accept(socket);     // 顯示連接進來的客戶端     std::cout <<"remote ip:"<<socket.remote_endpoint().address()<<endl;     std::cout <<"remote port:"<<socket.remote_endpoint().port() << std::endl;      char buf[2048];     boost::system::error_code ec;     while(1)     {       socket.read_some(buffer(buf),ec);       if (ec)       {         std::cout <<boost::system::system_error(ec).what() << std::endl;         break ;       }       std::cout<<"recv msg:"<<buf<<endl;       if(strcmp(buf,"bye")==0)//收到結束消息結束客戶端連接       {         break;       }       socket.write_some(buffer("I heared you!/n"),ec);       if (ec)       {         std::cout <<boost::system::system_error(ec).what() << std::endl;         break ;       }     }     socket.close();     // 與當前客戶交互完成后循環繼續等待下一客戶連接   }   return 0; } 

客戶端

// BoostTcpClient.cpp : 定義控制臺應用程序的入口點。 //  #include "stdafx.h" #include "boost/asio.hpp"  using namespace boost::asio;  #ifdef _MSC_VER #define _WIN32_WINNT  0X0501 //避免VC下編譯警告 #endif  #define PORT 1000 #define IPV6 //#define IPV4  int _tmain(int argc, _TCHAR* argv[]) {   // 所有asio類都需要io_service對象   io_service iosev;   // socket對象   ip::tcp::socket socket(iosev);    // 連接端點,這里使用了本機連接,可以修改IP地址測試遠程連接 #ifdef IPV4   ip::address_v4 address=ip::address_v4::from_string("127.0.0.1"); #endif  #ifdef IPV6   //"0:0:0:0:0:0:0:1"為IPV6的本機回環地址,類似于"127.0.0.1"   ip::address_v6 address=ip::address_v6::from_string("0:0:0:0:0:0:0:1"); #endif   ip::tcp::endpoint ep(address, PORT);   // 連接服務器   boost::system::error_code ec;   socket.connect(ep,ec);   // 如果出錯,打印出錯信息   if (ec)   {     std::cout << boost::system::system_error(ec).what() << std::endl;     return -1;   }    //循環發送和接收數據   for(int i=0;i<5;++i)   {     //發送數據     socket.write_some(buffer("hello"), ec);     // 接收數據     char buf[100];     size_t len=socket.read_some(buffer(buf), ec);     std::cout.write(buf, len);     Sleep(500);   }   //發送與服務端約定好的結束語,由服務端斷鏈   socket.write_some(buffer("bye"), ec);      getchar();   return 0; } 

代碼中兼容了IPV4和IPV6兩種IP協議,使用宏定義選擇使用哪種IP協議,當然客戶端和服務端的協議必須一致才能正常通信。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南昌市| 克什克腾旗| 南通市| 莎车县| 泰州市| 瑞安市| 出国| 张北县| 海淀区| 井研县| 大安市| 门头沟区| 寻乌县| 徐闻县| 搜索| 德江县| 双城市| 衡阳县| 康定县| 桂林市| 海南省| 亚东县| 浠水县| 永济市| 彩票| 遂平县| 阿尔山市| 辰溪县| 景谷| 简阳市| 马鞍山市| 长岭县| 三明市| 建阳市| 自贡市| 衡山县| 溧水县| 乃东县| 汾阳市| 浏阳市| 吴堡县|