最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年11月29日 15:06:05   投稿:lqh  
這篇文章主要介紹了C++ boost::asio編程-同步TCP詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

boost::asio編程-同步TCP

boost.asio庫(kù)是一個(gè)跨平臺(tái)的網(wǎng)絡(luò)及底層IO的C++編程庫(kù),它使用現(xiàn)代C++手法實(shí)現(xiàn)了統(tǒng)一的異步調(diào)用模型。

boost.asio庫(kù)支持TCP、UDP、ICMP通信協(xié)議。

下面介紹同步TCP模式:

大家好!我是同步方式!

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

在服務(wù)器端,我會(huì)做個(gè)socket交給acceptor對(duì)象,讓它一直等客戶端連進(jìn)來,連上以后再通過這個(gè)socket與客戶端通信, 而所有的通信都是以阻塞方式進(jìn)行的,讀完或?qū)懲瓴艜?huì)返回。

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

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

同步方式示例代碼:

服務(wù)器端

// BoostTcpServer.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 
// 
 
#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對(duì)象 
  io_service iosev; 
 
  //創(chuàng)建用于接收客戶端連接的acceptor對(duì)象 
#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對(duì)象 
    ip::tcp::socket socket(iosev); 
    // 等待直到客戶端連接進(jìn)來 
    acceptor.accept(socket); 
    // 顯示連接進(jìn)來的客戶端 
    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)//收到結(jié)束消息結(jié)束客戶端連接 
      { 
        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(); 
    // 與當(dāng)前客戶交互完成后循環(huán)繼續(xù)等待下一客戶連接 
  } 
  return 0; 
} 

客戶端

// BoostTcpClient.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 
// 
 
#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對(duì)象 
  io_service iosev; 
  // socket對(duì)象 
  ip::tcp::socket socket(iosev); 
 
  // 連接端點(diǎn),這里使用了本機(jī)連接,可以修改IP地址測(cè)試遠(yuǎn)程連接 
#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的本機(jī)回環(huán)地址,類似于"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); 
  // 連接服務(wù)器 
  boost::system::error_code ec; 
  socket.connect(ep,ec); 
  // 如果出錯(cuò),打印出錯(cuò)信息 
  if (ec) 
  { 
    std::cout << boost::system::system_error(ec).what() << std::endl; 
    return -1; 
  } 
 
  //循環(huán)發(fā)送和接收數(shù)據(jù) 
  for(int i=0;i<5;++i) 
  { 
    //發(fā)送數(shù)據(jù) 
    socket.write_some(buffer("hello"), ec); 
    // 接收數(shù)據(jù) 
    char buf[100]; 
    size_t len=socket.read_some(buffer(buf), ec); 
    std::cout.write(buf, len); 
    Sleep(500); 
  } 
  //發(fā)送與服務(wù)端約定好的結(jié)束語(yǔ),由服務(wù)端斷鏈 
  socket.write_some(buffer("bye"), ec); 
   
  getchar(); 
  return 0; 
} 

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

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

相關(guān)文章

  • C++刪除鏈表中間節(jié)點(diǎn)的方法

    C++刪除鏈表中間節(jié)點(diǎn)的方法

    這篇文章主要介紹了C++刪除鏈表中間節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了鏈表刪除中間節(jié)點(diǎn)的具體思路與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C++中Boost庫(kù)裁剪與其應(yīng)用詳解

    C++中Boost庫(kù)裁剪與其應(yīng)用詳解

    大家都知道STL全稱"標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library)",其實(shí)它是一套標(biāo)準(zhǔn),可能有不同的實(shí)現(xiàn),它是 C++ 的"標(biāo)準(zhǔn)庫(kù)"。Boost 則是一個(gè) C++ 庫(kù),被稱為"C++ 準(zhǔn)標(biāo)準(zhǔn)庫(kù)"。那么這篇文章文章我們就來詳細(xì)的介紹C++Boost庫(kù)的裁剪與其應(yīng)用,感興趣的朋友可以一起學(xué)習(xí)。
    2016-10-10
  • C語(yǔ)言中static的使用方法實(shí)例詳解

    C語(yǔ)言中static的使用方法實(shí)例詳解

    static一般用于修飾局部變量,全局變量,函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中static用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 淺談C語(yǔ)言中include

    淺談C語(yǔ)言中include""與include<>的區(qū)別

    C語(yǔ)言中包含文件有兩種包含符號(hào),一個(gè)是<>尖括號(hào),另一個(gè)是""雙引號(hào)。那么這兩個(gè)有什么區(qū)別呢?本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例

    Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例,CCLayerColor是一個(gè)顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下
    2014-09-09
  • C++深入分析講解智能指針

    C++深入分析講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會(huì)產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-05-05
  • C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的使用與講解

    C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的使用與講解

    今天小編就為大家分享一篇關(guān)于C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的使用與講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng)(文件數(shù)據(jù)庫(kù))

    C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng)(文件數(shù)據(jù)庫(kù))

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中AVL樹的底層以及實(shí)現(xiàn)方法總結(jié)

    C++中AVL樹的底層以及實(shí)現(xiàn)方法總結(jié)

    這篇文章主要介紹了C++中AVL樹的底層以及實(shí)現(xiàn)方法的相關(guān)資料,AVL樹是一種自平衡的二叉搜索樹,每個(gè)節(jié)點(diǎn)的左右子樹高度差不超過1,通過旋轉(zhuǎn)操作保持平衡,詳解了AVL樹的結(jié)構(gòu)、插入、旋轉(zhuǎn)、查找和遍歷方法,展示了其保持平衡的機(jī)制及對(duì)應(yīng)代碼實(shí)現(xiàn),需要的朋友可以參考下
    2024-10-10
  • C++實(shí)現(xiàn)線性表順序存儲(chǔ)的示例代碼

    C++實(shí)現(xiàn)線性表順序存儲(chǔ)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性表順序存儲(chǔ)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-03-03

最新評(píng)論

远安县| 和静县| 永宁县| 内江市| 锡林郭勒盟| 双牌县| 鄂托克旗| 二手房| 延川县| 阜康市| 阿巴嘎旗| 揭阳市| 三明市| 兴宁市| 鄂尔多斯市| 本溪| 长兴县| 固原市| 屯门区| 鄱阳县| 大田县| 浦江县| 岢岚县| 榆中县| 海城市| 定结县| 西宁市| 盐山县| 水富县| 庆安县| 定襄县| 德化县| 包头市| 永城市| 建阳市| 安西县| 自治县| 谷城县| 威宁| 建昌县| 洪湖市|