boost asio程式設計 同步TCP

2021-08-18 04:37:08 字數 1870 閱讀 4636

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)

std::cout

<<"recv msg:"

socket.write_some(buffer("i heared you!\n"),ec);

if (ec)

} 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)

//迴圈傳送和接收資料

for(int i=0;i<5;++i)

//傳送與服務端約定好的結束語,由服務端斷鏈

socket.write_some(buffer("bye"), ec);

getchar();

return

0;

}

**中相容了ipv4和ipv6兩種ip協議,使用巨集定義選擇使用哪種ip協議,當然客戶端和服務端的協議必須一致才能正常通訊。

boost asio 的同步方式

boost.asio是乙個跨平台的網路及底層io的c 程式設計庫,它使用現代c 手法實現了統一的非同步呼叫模型。標頭檔案 include名空間 using namespace boost asio asio庫能夠使用tcp udp icmp 串列埠來傳送 接收資料,下面先介紹tcp協議 的讀寫操作 ...

boost asio的Tcp同步方式

boost.asio是乙個跨平台的網路及底層io的c 程式設計庫。標頭檔案 include命名空間 using namespace boost asio using boost asio ip tcp asio庫能夠使用tcp udp icmp 串列埠來傳送 接收資料,本文件介紹tcp協議的同步讀寫...

Boost asio學習筆記 網路程式設計

boost庫中的網路程式設計的例子比較複雜,不太好理解,所以,從網上找了乙個簡單點的例子。如下 經過修改,可以執行。伺服器 servier.cpp include include bind hpp include include include iostream using boost asio i...