欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

boost::asio編程-同步TCP

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

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

下面介紹同步TCP模式:

大家好!我是同步方式!

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

在服務器端,我會做個socket交給acceptor對象,讓它一直等客戶端連進來,連上以后再通過這個socket與客戶端通信, 而所有的通信都是以阻塞方式進行的,讀完或?qū)懲瓴艜祷亍?br />

在客戶端也一樣,這時我會拿著socket去連接服務器,當然也是連上或出錯了才返回,最后也是以阻塞的方式和服務器通信。
有人認為同步方式?jīng)]有異步方式高效,其實這是片面的理解。在單線程的情況下可能確實如此,我不能利用耗時的網(wǎng)絡操作這段時間做別的事 情,不是好的統(tǒng)籌方法。不過這個問題可以通過多線程來避免,比如在服務器端讓其中一個線程負責等待客戶端連接,連接進來后把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; 
 
  //創(chuàng)建用于接收客戶端連接的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)//收到結(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(); 
    // 與當前客戶交互完成后循環(huán)繼續(xù)等待下一客戶連接 
  } 
  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的本機回環(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); 
  // 連接服務器 
  boost::system::error_code ec; 
  socket.connect(ep,ec); 
  // 如果出錯,打印出錯信息 
  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ā)送與服務端約定好的結(jié)束語,由服務端斷鏈 
  socket.write_some(buffer("bye"), ec); 
   
  getchar(); 
  return 0; 
} 

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

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

相關文章

  • C++解析特殊符號tab、換行符號實例代碼

    C++解析特殊符號tab、換行符號實例代碼

    這篇文章主要給大家介紹了關于C++解析特殊符號tab、換行符號的相關資料,這個功能在我們?nèi)粘i_發(fā)中經(jīng)常會遇到,需要的朋友可以參考下
    2021-05-05
  • 深入理解C++11:探索lambda函數(shù)的奧秘

    深入理解C++11:探索lambda函數(shù)的奧秘

    聚焦于C++11,讓我們一起探索lambda函數(shù)的奧秘,本指南將帶您深入了解這個強大的編程工具,讓您在編程世界中如虎添翼,無論您是初學者還是有經(jīng)驗的開發(fā)者,本指南都將為您帶來全新的視角和實用的技巧,需要的朋友可以參考下
    2024-01-01
  • c/c++語言位域注意事項分析

    c/c++語言位域注意事項分析

    所謂“位域”是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域, 并說明每個區(qū)域的位數(shù)。每個域有一個域名,答應在程序中按域名進行操作
    2013-09-09
  • 單線程會導致死鎖你知道嗎

    單線程會導致死鎖你知道嗎

    這篇文章主要為大家詳細介紹了單線程會不會導致死鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言利用sprintf固定字符串輸出位數(shù)

    C語言利用sprintf固定字符串輸出位數(shù)

    sprintf?函數(shù)是一個?C?語言中的函數(shù),也被許多其他編程語言所支持。這篇文章主要介紹了C語言如何利用sprintf固定字符串輸出位數(shù),需要的可以參考一下
    2023-03-03
  • 一起來看看C語言線性表的線性鏈表

    一起來看看C語言線性表的線性鏈表

    這篇文章主要為大家詳細介紹了C語言線性表的線性鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言靜態(tài)與動態(tài)通訊錄的實現(xiàn)流程詳解

    C語言靜態(tài)與動態(tài)通訊錄的實現(xiàn)流程詳解

    這篇文章主要為大家介紹了C語言分別實現(xiàn)靜態(tài)與動態(tài)的通訊錄示例代碼教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • 12個C語言必背實例分享

    12個C語言必背實例分享

    這篇文章主要和大家介紹12個C語言中必背的實例,文中的示例代碼講解詳細,對我們了解和掌握C語言有一定的幫助,感興趣的小伙伴快跟隨小編一起了解一下
    2022-11-11
  • VC++文件監(jiān)控之FindFirstChangeNotification

    VC++文件監(jiān)控之FindFirstChangeNotification

    因為ReadDirectoryChangesW 上次測試發(fā)現(xiàn)不能多級目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來實施文件監(jiān)控,需要的朋友可以參考下
    2019-04-04
  • C++ opencv實現(xiàn)車道線識別

    C++ opencv實現(xiàn)車道線識別

    這篇文章主要為大家詳細介紹了C++ opencv實現(xiàn)車道線識別,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評論