C++ boost::asio編程-同步TCP詳解及實例代碼
boost::asio編程-同步TCP
boost.asio庫是一個跨平臺的網(wǎng)絡(luò)及底層IO的C++編程庫,它使用現(xiàn)代C++手法實現(xiàn)了統(tǒng)一的異步調(diào)用模型。
boost.asio庫支持TCP、UDP、ICMP通信協(xié)議。
下面介紹同步TCP模式:
大家好!我是同步方式!
我的主要特點就是執(zhí)著!所有的操作都要完成或出錯才會返回,不過偶的執(zhí)著被大家稱之為阻塞,實在是郁悶~~(場下一片噓聲),其實這樣 也是有好處的,比如邏輯清晰,編程比較容易。
在服務(wù)器端,我會做個socket交給acceptor對象,讓它一直等客戶端連進來,連上以后再通過這個socket與客戶端通信, 而所有的通信都是以阻塞方式進行的,讀完或?qū)懲瓴艜祷亍?br />
在客戶端也一樣,這時我會拿著socket去連接服務(wù)器,當(dāng)然也是連上或出錯了才返回,最后也是以阻塞的方式和服務(wù)器通信。
有人認(rèn)為同步方式?jīng)]有異步方式高效,其實這是片面的理解。在單線程的情況下可能確實如此,我不能利用耗時的網(wǎng)絡(luò)操作這段時間做別的事 情,不是好的統(tǒng)籌方法。不過這個問題可以通過多線程來避免,比如在服務(wù)器端讓其中一個線程負(fù)責(zé)等待客戶端連接,連接進來后把socket交給另外的線程去 和客戶端通信,這樣與一個客戶端通信的同時也能接受其它客戶端的連接,主線程也完全被解放了出來。
我的介紹就有這里,謝謝大家!
同步方式示例代碼:
服務(wù)器端
// BoostTcpServer.cpp : 定義控制臺應(yīng)用程序的入口點。
//
#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();
// 與當(dāng)前客戶交互完成后循環(huán)繼續(xù)等待下一客戶連接
}
return 0;
}
客戶端
// BoostTcpClient.cpp : 定義控制臺應(yīng)用程序的入口點。
//
#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地址測試遠(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的本機回環(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);
// 如果出錯,打印出錯信息
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é)束語,由服務(wù)端斷鏈
socket.write_some(buffer("bye"), ec);
getchar();
return 0;
}
代碼中兼容了IPV4和IPV6兩種IP協(xié)議,使用宏定義選擇使用哪種IP協(xié)議,當(dāng)然客戶端和服務(wù)端的協(xié)議必須一致才能正常通信。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
淺談C語言中include""與include<>的區(qū)別
C語言中包含文件有兩種包含符號,一個是<>尖括號,另一個是""雙引號。那么這兩個有什么區(qū)別呢?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-06-06
Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實例
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實例,CCLayerColor是一個顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下2014-09-09
C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的使用與講解
今天小編就為大家分享一篇關(guān)于C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的使用與講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
C語言實現(xiàn)圖書管理系統(tǒng)(文件數(shù)據(jù)庫)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C++中AVL樹的底層以及實現(xiàn)方法總結(jié)
這篇文章主要介紹了C++中AVL樹的底層以及實現(xiàn)方法的相關(guān)資料,AVL樹是一種自平衡的二叉搜索樹,每個節(jié)點的左右子樹高度差不超過1,通過旋轉(zhuǎn)操作保持平衡,詳解了AVL樹的結(jié)構(gòu)、插入、旋轉(zhuǎn)、查找和遍歷方法,展示了其保持平衡的機制及對應(yīng)代碼實現(xiàn),需要的朋友可以參考下2024-10-10

