继续记录-Boost.Asio基本原理

    • 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下不支持。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值