其他协议的支持

通过实现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

results matching ""

    No results matching ""