標籤:非同步 boost asio
Boost.Asio基礎Network APIBoost.Asio 命名空間
boost::asio命名空間包含了Boost Asio庫的所有東西,它下面還有一些子命名空間:
- boost::asio: 它包含了核心的類和功能模組。最重要的類是io_service和streambuf。裡面還有一些自由函數,read,read_at,read_util,write等,以及它們的非同步版本。
- boost::asio::ip: 重要的類有address,endpoint,tcp,udp,icmp和自由函數connect、async_connect。
- boost::asio::error: 包含了使用I/O過程總碰到的錯誤碼。
- boost::asio::ssl: 包含處理SSL的一些類。
- boost::asio::local: 包含POSIX特定的類。
- boost::asio::windows: 包含Windows平台特定的類。
IP地址
Boost.Asio提供了ip::address類,來處理IP地址,有兩個實現,ip_address_v4和ip_address_v6。
它們有的功能都不多,其中最重要的有:
- ip::address(v4_or_v6_address): 這個函數把一個v4或者v6的地址轉換成ip::address
- ip::address::from_string(str): 這個函數從IPv4(以點分割開)或者IPv6(16進位表示)地址來建立一個地址對象。
- ip::address::to_string(): 這個函數返回易讀的地址字串
- ip::address_v4::broadcast([addr, mask]): 這個函數建立一個廣播位址
- ip::address_v4::any(): 這個函數返回一個可以表示任意地址的ip::address
- ip::address_v4::loopback(), ip::address_v6::loopback(): 返回迴環地址
- ip::host_name(): 以字串的形式,返回當前主機的名稱。
大多數時候,我們使用ip::address::from_string:
ip::address addr = ip::address::from_string("127.0.0.1");
要是想串連到一個指定名稱的主機,下面的是錯誤的:
//throw an exception:ip::address addr = ip::address::from_string("www.baidu.com");
端點(Endpoints)
端點就是你要串連的地址,它還有個叫連接埠的屬性。每一個不同的socket類型都有屬於它自己的endpoint類,比如ip::tcp::endpoint,ip::udp::endpoint,和ip::icmp::endpoint。
例如,你想串連到本地的80連接埠,代碼如下:
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 80);
有3中方法建立endpoint:
- endpoint(): 預設建構函式,可以用於UDP/ICMP socket
- endpoint(protocol, port): 通常用於伺服器端socket,用來接受新的串連
- endpoint(addr, port): 由給定的地址和連接埠來建立endpoint
樣本:
ip::tcp::endpoint ep1;ip::tcp::endpoint ep2(ip::tcp::v4(), 80);ip::tcp::endpoint ep3(ip::address::from_string("127.0.0.1"), 80);
如果是要串連到一個指定名稱的主機(不是IP地址):
io_service service;ip::tcp::resolver resolver(service);ip::tcp::resolver::query query("www.baidu.com", "80");ip::tcp::resolver::iterator iter = resolver.resolver(query);ip::tcp::endpoint ep = *iter;std::cout << ep.address().to_string() <<std::endl;
可以替換tcp為其他類型的socket。
給定一個endpoint,可以擷取它的地址、連接埠和IP協議等資訊:
std::cout << ep.address().to_string() << "." << ep.port() << "/" << ep.protocal() << std::endl;
Boost.Asio基礎(一)