其他协议的支持
通过实现protocol type requirements可以完成其他socket协议(比如Bluetooth和IRCOMM) 。在很多时候,这些协议也需要基础协议的支持。Asio提供了以下的类来支持它们:
- generic::datagram_protocol
- generic::raw_protocol
generic::seq_packet_protocol
generic::stream_protocol
这些类实现了protocol type requirements,而且允许用户在运行时特化地址类型(比如AF_INET)和协议族(比如IPPROTO_TCP)。如下:
asio::generic::stream_protocol::socket my_socket(my_io_service);
my_socket.open(asio::generic::stream_protocol(AF_INET, IPPROTO_TCP));
...
端点类aiso::generic::basic_endpoint的模板声明中,为了支持所有协议,能存放所有端点类型,它能放入sockaddr_storage结构的对象。当然,这个类的对象也能从其他子类转化而来。
asio::ip::tcp::endpoint my_endpoint1 = ...;
asio::generic::stream_protocol::endpoint my_endpoint2(my_endpoint1);
这种类型转换时隐式的,所以能支持如下的表达式:
asio::generic::stream_protocol::socket my_socket(my_io_service);
asio::ip::tcp::endpoint my_endpoint = ...;
my_socket.connect(my_endpoint);
C++11 移动语义
如果你使用的是C++11,通过移动语义的特性,你可以把一个socket或者acceptor对象转化为更加基本的协议的socket类型,前提是该类型转换是合法的。
如果:
Protocol1 p1 = ...;
Protocol2 p2(p1);
那么,相应的socket语法也是合法的:
Protocol1::socket my_sokcet1(my_io_service);
...
Protocol2::socket my_socket2(std::move(my_socket1));
举个栗子,TCP转化到流式的socket:
asio::ip::tcp::socket my_socket1(my_io_service);
...
asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));
这种表达式不仅仅支持基础的协议类,用户自定义的协议,只要能确定是具有相似特性(译者注:此处指继承于generic而且同为/同不为流式socket),那么都可以使用移动语义表达式来快速开发。
接收Generic Sockets
方便起见,socket的accept和async_accept函数能接收不同类型的协议数据,当然那个协议的互相转化要是合法的。例如,tcp和 stream_protocol就是能互相转化的,所以能被接收:
asio::ip::tcp::acceptor my_acceptor(my_io_service);
...
asio::generic::stream_protocol::socket my_socket(my_io_service);
my_acceptor.accept(my_socket);
参见
generic::datagram_protocol, generic::raw_protocol, generic::seq_packet_protocol, generic::stream_protocol, protocol type requirements