服務端:
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。而同步通訊與非同步通訊則是序列通訊的兩種不同方式,分別適合於不同的場...
同步通訊與非同步通訊
非同步通訊 是一種很常用的通訊方式。非同步通訊在傳送字元時,所傳送的字元之間的時間間隔可以是任意的。當然,接收端必須時刻做好接收的準備 如果接收端主機的電源都沒有加上,那麼傳送端傳送字元就沒有意義,因為接收端根本無法接收 傳送端可以在任意時刻開始傳送字元,因此必須在每乙個字元的開始和結束的地方加上標...