• Boost.Asio命名空间
Boost.Asio的所有内容都包含在boost::asio命名空间或者其子命名空间内。
1. boost::asio:这是核心类和函数所在的地方。重要的类有io_service和streambuf。类似read,read_at, read_until方法,它们的异步方法,它们的写方法和异步写方法等自由函数也在这里。
2. boost::asio::ip:这是网络通信部分所在的地方。重要的类有address,endpoint, tcp,udp和icmp,重要的自由函数有connect和async_connect。
3. 要注意的是在boost::asio::ip::tcp::socket中间,socket只是boost::asio::ip::tcp类中间的一个typedef关键字。 boost::asio::error:这个命名空间包含了调用I/O例程时返回的错误码
4. boost::asio::ssl:包含了SSL处理类的命名空间
5. boost::asio::local:这个命名空间包含了POSIX特性的类
6. boost::asio::windows:这个命名空间包含了Windows特性的
• IP地址
对于IP地址的处理,Boost.Asio提供了ip::address,ip::address_v4和ip::address_v6类。它们提供了相当多 的函数。
下面列出了最重要的几个:
1. ip::address(v4_or_v6_address): 这个函数把一个v4或者v6的地址转换成
2. ip::address ip::address:from_string(str):这个函数根据一个IPv4地址(用.隔开的)或者一个IPv6地址(十六进制 表示)创建一个地址。
3. ip::address::to_string() :这个函数返回这个地址的字符串。
4. ip::address_v4::broadcast([addr,mask]):这个函数创建了一个广播地址 ip::address_v4::any():这个函 数返回一个能表示任意地址的地址。
5. ip::address_v4::loopback(),ip_address_v6::loopback():这个函数返回环路地址(为v4/v6协议)
6. ip::host_name():这个函数用string数据类型返回当前的主机名。
大多数情况下使用:ip::address::from_string:
例:ip::address addr =ip::address::from_string("127.0.0.1");
• 端点
端点是使用某个端口连接到的一个地址。不同类型的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);
有三种方式建立一个端点:
1. endpoint():这是默认构造函数,某些时候可以用来创建UDP/ICMP socket。
2. endpoint(protocol,port):这个方法通常用来创建可以接受新连接的服务器端socket。
3. endpoint(addr, port):这个方法创建了一个连接到某个地址和端口的端点
例子如下:
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);
• 套接字
Boost.Asio有三种类型的套接字类:ip::tcp,ip::udp和ip::icmp。当然它也是可扩展的。
可以把ip::tcp,ip::udp,ip::icmp类当作占位符;它们可以让你便捷地访问其他类/函数,如下所示:
1. ip::tcp::socket, ip::tcp::acceptor,ip::tcp::endpoint,ip::tcp::resolver,ip::tcp::iostream
2. ip::udp::socket,ip::udp::endpoint,ip::udp::resolver
3. ip::icmp::socket,ip::icmp::endpoint,ip::icmp::resolver
socket类创建一个相应的socket。而且总是在构造的时候传入io_service实例:
io_service service;
ip::udp::socket sock(service)
sock.set_option(ip::udp::socket::reuse_address(true));
每一个socket的名字都是一个typedef关键字
ip::tcp::socket =basic_stream_socket
ip::udp::socket =basic_datagram_socket
ip::icmp::socket =basic_raw_socket
• Socket成员方法
注意所有的异步方法都立刻返回,而它们相对的同步实现需要操作完成之后才能返回。
这些方法是用来连接或绑定socket、断开socket字连接以及查询连接是活动还是非活动的:
1. assign(protocol,socket):这个函数分配了一个原生的socket给这个socket实例。当处理老(旧)程序 时会使用它(也就是说,原生socket已经被建立了)
2. open(protocol):这个函数用给定的IP协议(v4或者v6)打开一个socket。主要在UDP/ICMP socket,或者服务端socket上使用。
3. bind(endpoint):这个函数绑定到一个地址 。
4. connect(endpoint):这个函数用同步的方式连接到一个地址 async_connect(endpoint):这个函数用异步的方式连接到一个地址
5. is_open():如果套接字已经打开,这个函数返回true
6. close():这个函数用来关闭套接字。调用时这个套接字上任何的异步操作都会被立即关闭,同时返回 error::operation_aborted错误码。
7. shutdown(type_of_shutdown):这个函数立即使send或者receive操作失效,或者两者都失效。
8. cancel():这个函数取消套接字上所有的异步操作。这个套接字上任何的异步操作都会立即结束,然后 返回error::operation_aborted错误码。
示例
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"),80);
ip::tcp::socket sock(service);
sock.open(ip::tcp::v4());
sock.connect(ep);
sock.write_some(buffer("GET/index.html\r\n"));
char buff[1024];
sock.read_some(buffer(buff,1024));
sock.shutdown(ip::tcp::socket::shutdown_receive);
sock.close();
• 读写函数(这些是在套接字上执行I/O操作的函数。)
对于异步函数来说处理程序的格式 : void handler(const boost::system::error_code&e,size_t bytes)都是一样的
1. async_receive(buffer,[flags,] handler):这个函数启动从套接字异步接收数据的操作。
2. async_read_some(buffer,handler):这个函数和async_receive(buffer, handler)功能一样。
3. async_receive_from(buffer,endpoint[,flags],handler):这个函数启动从一个指定端点异步接收数据的操作。
4. async_send(buffer[,flags],handler):这个函数启动了一个异步发送缓冲区数据的操作。
5. async_write_some(buffer,handler):这个函数和async_send(buffer,handler)功能一致。
6. async_send_to(buffer,endpoint, handler):这个函数启动了一个异步send缓冲区数据到指定端点的操作。
7. receive(buffer[,flags]):这个函数异步地从所给的缓冲区读取数据。在读完所有数据或者错误出现之前,这个函数都是阻塞的。
8. read_some(buffer):这个函数的功能和receive(buffer)是一致的。
9. receive_from(buffer,endpoint [,flags])*:这个函数异步地从一个指定的端点获取数据并写入到给 定的缓冲区。在读完所有数据或者错误出现之前,这个函数都是阻塞的。
10. send(buffer[,flags]):这个函数同步地发送缓冲区的数据。在所有数据发送成功或者出现错误之前, 这个函数都是阻塞的。
11. write_some(buffer):这个函数和send(buffer)的功能一致。
12. send_to(buffer, endpoint[,flags]):这个函数同步地把缓冲区数据发送到一个指定的端点。在所有数据 发送成功或者出现错误之前,这个函数都是阻塞的。
13. available():这个函数返回有多少字节的数据可以无阻塞地进行同步读取。
•标记 : 标记的默认值是0,但是也可以是以下几种:
1. ip::socket_type::socket::message_peek:这个标记只监测并返回某个消息,但是下一次读消息的调用会重新读取这个消息。
2. ip::socket_type::socket::message_out_of_band:这个标记处理带外(OOB)数据,OOB数据是被标记为比正常数据更重要的数据。
3. ip::socket_type::socket::message_do_not_route:这个标记指定数据不使用路由表来发送。
ip::socket_type::socket::message_end_of_record:这个标记指定的数据标识了记录的结束。在 Windows下不支持。