boost庫實現同步 非同步通訊

2021-07-25 00:24:13 字數 2779 閱讀 7809

服務端:

boost.asio是乙個跨平台的網路及底層io的c++程式設計庫,它使用現代c++手法實現了統一的非同步呼叫模型。

標頭檔案

#include
名空間

using namespace boost::asio;
asio庫能夠使用tcp、udp、icmp、串列埠來傳送/接收資料,下面先介紹tcp協議的讀寫操作

對於讀寫方式,asio支援同步和非同步兩種方式,首先登場的是同步方式,下面請同步方式自我介紹一下:

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

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

在客戶端也一樣,這時我會拿著socket去連線伺服器,當然也是連上或出錯了才返回,最後也是以阻塞的方式和伺服器通訊。

有人認為同步方式沒有非同步方式高效,其實這是片面的理解。在單執行緒的情況下可能確實如此,我不能利用耗時的網路操作這段時間做別的事 情,不是好的統籌方法。不過這個問題可以通過多執行緒來避免,比如在伺服器端讓其中乙個執行緒負責等待客戶端連線,連線進來後把socket交給另外的執行緒去 和客戶端通訊,這樣與乙個客戶端通訊的同時也能接受其它客戶端的連線,主線程也完全被解放了出來。

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

好,感謝同步方式的自我介紹,現在放出同步方式的演示**(起立鼓掌!):

伺服器端

#include 

#include 

using

namespace boost::asio;

int main(int argc, char* argv)

// 與當前客戶互動完成後迴圈繼續等待下一客戶連線

}return 0;} 

客戶端#include 

#include 

using

namespace boost::asio;

int main(int argc, char* argv)

// 接收資料

char buf[100];

size_t len=socket.read_some(buffer(buf), ec);

std::cout.write(buf, len);

return 0;} 

從演示**可以得知

// --已經解決,boost::asio::async_read(...)讀取的位元組長度不能大於資料流的長度,否則就會進入

// ioservice.run()執行緒等待,read後面的就不執行了。

//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

//        boost::bind(&clientsession::handle_read,shared_from_this(),

//        boost::asio::placeholders::error));

//max_len可以換成較小的數字,就會發現async_read_some可以連續接收未收完的資料

m_socket.async_read_some(boost:

:asio:

:buffer(data_,max_len)

,boost:

:bind

(&clientsession:

:handle_read,shared_from_this(),

boost:

:asio:

:placeholders:

:error))

;}private

:void handle_write(

const boost:

:system

::error_code&

error)}

void handle_read(

const boost:

:system

::error_code&

error

)else

}private

:tcp:

:socket m_socket;

char data_[max_len];}

;typedef boost:

:shared_ptr session_ptr;

public

::asio:

:io_service& ioservice,tcp:

:endpoint& endpoint)

:m_ioservice(ioservice)

,acceptor_(ioservice,endpoint)

)private

:void handle_accept(

const boost:

:system

::error_code&

error

,session_ptr& session)

}private

:boost:

:asio:

:io_service& m_ioservice;

tcp:

:acceptor acceptor_;};

int main(

int argc ,

char

* argv)

同步非同步通訊

同步通訊 stm 同步傳輸的特點是可獲得較高的傳輸速度,但實現起來較複雜。同步傳輸是按資料幀進行傳送 字元與字元間的傳輸是同步無間隔的,收發方的時鐘必須嚴格一致。非同步通訊 atm 非同步傳輸方式 stm 是按字元乙個乙個地傳送,字元與字元間傳輸間隔是任意的,傳送方和接收方的時鐘要求沒有同步的嚴格。...

同步通訊 VS 非同步通訊

在描述同步通訊與非同步通訊之前,我們先得搞清序列通訊的內涵。序列通訊是指計算機主機與外設之間,以及主機系統與主機系統之間資料的序列傳輸。使用串列埠進行資料傳輸時,傳送和接收的每乙個字元實際上都是一次一位的傳送的,每一位為1或者為0。而同步通訊與非同步通訊則是序列通訊的兩種不同方式,分別適合於不同的場...

同步通訊與非同步通訊

非同步通訊 是一種很常用的通訊方式。非同步通訊在傳送字元時,所傳送的字元之間的時間間隔可以是任意的。當然,接收端必須時刻做好接收的準備 如果接收端主機的電源都沒有加上,那麼傳送端傳送字元就沒有意義,因為接收端根本無法接收 傳送端可以在任意時刻開始傳送字元,因此必須在每乙個字元的開始和結束的地方加上標...