boost庫使用—asio庫
****
一、boost庫asio簡介
Boost Asio ( asynchronous input and output)關注異步輸入輸出。Boost Asio庫提供了平臺無關性的異步數據處理能力(當然它也支持同步數據處理)。一般的數據傳輸過程需要通過函數的返回值來判斷數據傳輸是否成功。Boost Asio將數據傳輸分爲兩個獨立的步驟:
- 採用異步任務的方式開始 數據傳輸。
- 將傳輸結果通知調用端
與傳統方式相比,優點在於程序在數據傳輸期間不會阻塞。
二、API介紹
Boost.Asio的所有內容都包含在boost::asio命名空間或者其子命名空間內。
- boost::asio:這是核心類和函數所在的地方。重要的類有io_service和streambuf。類似read, read_at, read_until方法,它們的異步方法,它們的寫方法和異步寫方法等自由函數也在這裏。
- boost::asio::ip:這是網絡通信部分所在的地方。重要的類有address, endpoint, tcp, udp和icmp,重要的自由函數有connect和async_connect。要注意的是在boost::asio::ip::tcp::socket中間,socket只是boost::asio::ip::tcp類中間的一個typedef關鍵字。
- boost::asio::error:這個命名空間包含了調用I/O例程時返回的錯誤碼
- boost::asio::ssl:包含了SSL處理類的命名空間
- boost::asio::local:這個命名空間包含了POSIX特性的類
IP地址
對於IP地址的處理,Boost.Asio提供了ip::address , ip::address_v4和ip::address_v6類。 它們提供了相當多的函數。下面列出了最重要的幾個:
- ip::address(v4_or_v6_address):這個函數把一個v4或者v6的地址轉換成ip::address
- ip::address:from_string(str):這個函數根據一個IPv4地址(用.隔開的)或者一個IPv6地址(十六進制表示)創建一個地址。
- ip::address::to_string() :這個函數返回這個地址的字符串。
- ip::address_v4::broadcast([addr, mask]):這個函數創建了一個廣播地址 ip::address_v4::any():這個函數返回一個能表示任意地址的地址。
- ip::address_v4::loopback(), ip_address_v6::loopback():這個函數返回環路地址(爲v4/v6協議)
- ip::host_name():這個函數用string數據類型返回當前的主機名。
大多數情況你會選擇用ip::address::from_string:
ip::address addr = ip::address::from_string("127.0.0.1");
如果你想通過一個主機名進行連接,下面的代碼片段是無用的:
// 拋出異常
ip::address addr = ip::address::from_string("www.yahoo.com");
三、案例
同步客戶端+服務端
cli:
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
int main()
try
{
cout << "client start...." << endl;
//io_service對象
boost::asio::io_service ios;
//創建socket對象
boost::asio::ip::tcp::socket sock(ios);
//創建連接端
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),6688);
//連接
sock.connect(ep);
//定義一個緩衝區
//vector<char>str(100,0);
char data[128];
sock.read_some(boost::asio::buffer(data));
cout << "recive from "<<sock.remote_endpoint().address() << endl;
cout << data << endl;
system("pause");
return 0;
}
catch (exception& e)
{
cout << e.what()<< endl;
}
ser:
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
int main()
try
{
cout << "server start..." << endl;
//io_service對象
boost::asio::io_service ios;
//綁定端口6688
boost::asio::ip::tcp::acceptor acceptor(ios,
boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),6688));
cout << acceptor.local_endpoint().address() << endl;
while (1)
{
//socket對象
boost::asio::ip::tcp::socket sock(ios);
//阻塞等待socket連接
acceptor.accept(sock);
cout << "client:" ;
cout << sock.remote_endpoint().address() << endl;
sock.write_some(boost::asio::buffer("hello asio"));
}
return 0;
}
catch (exception& e)
{
cout <<e.what() << endl;
}
想了解學習更多C++後臺服務器方面的知識,請關注:
微信公衆號:C++後臺服務器開發