Поддержка других протоколов сокетов (таких как Bluetooth или IRCOMM) может быть добавлена путем реализации требований типа протокола . Однако во многих случаях эти протоколы могут также использоваться с Boost. Поддержка общего протокола Асио. За это, Буст. Asio предлагает следующие четыре класса:
Эти классы реализуют требования типа протокола, но позволяют пользователю указывать семейство адресов (например, AF_INET
) и тип протокола (например, IPPROTO_TCP
) во время выполнения. Например:
boost::asio::generic::stream_protocol::socket my_socket(my_io_service);
my_socket.open(boost::asio::generic::stream_protocol(AF_INET, IPPROTO_TCP));
...
Шаблон класса конечной точки boost::asio::generic::basic_endpoint
, включен для поддержки этих классов протоколов. Эта конечная точка может содержать любой другой тип конечной точки, при условии, что ее собственное представление вписывается в объект sockaddr_storage
. Этот класс также преобразуется из других типов, реализующих конечную точку . Типовые требования:
boost::asio::ip::tcp::endpoint my_endpoint1 = ...;
boost::asio::generic::stream_protocol::endpoint my_endpoint2(my_endpoint1);
Конверсия неявная, чтобы поддержать следующие случаи использования:
boost::asio::generic::stream_protocol::socket my_socket(my_io_service);
boost::asio::ip::tcp::endpoint my_endpoint = ...;
my_socket.connect(my_endpoint);
При использовании C++11 можно выполнить конструкцию перемещения из разъема (или акцептора) объекта для преобразования в более общий тип разъема (или акцептора) протокола. Если конвертация протокола действительна:
Protocol1 p1 = ...;
Protocol2 p2(p1);
затем допускается соответствующее преобразование сокета:
Protocol1::socket my_socket1(my_io_service);
...
Protocol2::socket my_socket2(std::move(my_socket1));
Например, одним из возможных преобразований является преобразование сокета TCP в общий ориентированный на поток сокет:
boost::asio::ip::tcp::socket my_socket1(my_io_service);
...
boost::asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));
Эти преобразования также доступны для назначения движения.
Эти преобразования не ограничиваются приведенными выше общими классами протоколов. Определяемые пользователем протоколы могут воспользоваться этой функцией, аналогично гарантируя, что преобразование из Протокол1
в Протокол2
является действительным, как указано выше.
Для удобства функции акцептора сокета принимают()
и async_accept()
могут непосредственно приниматься в разъем другого типа протокола при условии, что соответствующее преобразование протокола является действительным. Например, поддерживается следующее, поскольку протокол boost::asio::tcp
конвертируем в boost::generic::stream_protocol
:
boost::asio::ip::tcp::acceptor my_acceptor(my_io_service);
...
boost::asio::generic::stream_protocol::socket my_socket(my_io_service);
my_acceptor.accept(my_socket);
generic::
, generic::raw_protocol
, genericseq_packet_protocol
, generic::stream_protocol
, protocol type requirements.