C++ boost::asio編程-同步TCP詳解及實(shí)例代碼
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ì)返回,不過(guò)偶的執(zhí)著被大家稱之為阻塞,實(shí)在是郁悶~~(場(chǎng)下一片噓聲),其實(shí)這樣 也是有好處的,比如邏輯清晰,編程比較容易。
在服務(wù)器端,我會(huì)做個(gè)socket交給acceptor對(duì)象,讓它一直等客戶端連進(jìn)來(lái),連上以后再通過(guò)這個(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)籌方法。不過(guò)這個(gè)問(wèn)題可以通過(guò)多線程來(lái)避免,比如在服務(wù)器端讓其中一個(gè)線程負(fù)責(zé)等待客戶端連接,連接進(jìn)來(lái)后把socket交給另外的線程去 和客戶端通信,這樣與一個(gè)客戶端通信的同時(shí)也能接受其它客戶端的連接,主線程也完全被解放了出來(lái)。
我的介紹就有這里,謝謝大家!
同步方式示例代碼:
服務(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)來(lái) acceptor.accept(socket); // 顯示連接進(jìn)來(lái)的客戶端 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ì)本站的支持!
上一篇:C++讀入XML文件示例
欄 目:C語(yǔ)言
下一篇:C++ 類的構(gòu)造函數(shù)詳解及實(shí)例
本文標(biāo)題:C++ boost::asio編程-同步TCP詳解及實(shí)例代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1957.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載