기타 프로토콜 지원 (Support for Other Protocols)
Protocol type requirements(프로토콜 유형 요구사항)을 구현하여 다른 소켓 프로토콜(예: Bluetooth 또는 IRCOMM 소켓)에 대한 지원을 추가할 수 있다. 그러나 대부분의 경우 이런 프로토콜들은 Boost.Asio의 일반적인 지원과 함께 사용될 수 있다. 이를 위해, Boost.Asio는 다음 네 가지 클래스를 제공한다:
- generic::datagram_protocol
- generic::raw_protocol
- generic::seq_packet_protocol
- generic::stream_protocol
이런 클래스는 프로토콜 유형 요구사항을 구현하지만, 사용자가 런타임에 주소 패밀리(예: AF_INET)와 프로토콜 유형(예: IPPROTO_TCP)을 지정할 수 있다. 예를 들면 다음과 같다:
boost::asio::generic::stream_protocol::socket my_socket(my_io_context); my_socket.open(boost::asio::generic::stream_protocol(AF_INET, IPPROTO_TCP)); ...
이러한 프로토콜 클래스를 지원하기 위해 엔드포인트 클래스 템플릿인 boost::asio::generic::basic_endpoint가 포함된다. 이 엔드포인트의 기본 표현(native representation)이 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_context); boost::asio::ip::tcp::endpoint my_endpoint = ...; my_socket.connect(my_endpoint);
C++11 이동 생성 (C++11 Move Construction)
C++11을 사용하는 경우, 소켓(또는 승인기:acceptor) 개체에서 이동 생성(move construction)을 수행하여 보다 일반적인 프로토콜의 소켓(또는 승인기:acceptor) 유형으로 변환할 수 있다. 프로토콜 변환이 유효한 경우:
Protocol1 p1 = ...; Protocol2 p2(p1);
그러면 해당 소켓 변환이 허용된다:
Protocol1::socket my_socket1(my_io_context); ... Protocol2::socket my_socket2(std::move(my_socket1));
예를 들어, 한 가지 가능한 변환은 TCP 소켓에서 일반 스트림 지향(stream-oriented) 소켓으로 변환하는 것이다.
boost::asio::ip::tcp::socket my_socket1(my_io_context); ... boost::asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));
이러한 변환은 이동 할당(move-assignment)에도 사용할 수 있다.
이러한 변환은 위의 일반 프로토콜 클래스로 제한되지 않는다. 사용자 정의(user-defined) 프로토콜은 위와 같이 Protocol1에서 Protocol2로 변환의 유효함을 유사한지 확인하여 이 기능을 이용할 수 있다.
일반 소켓의 승인 (Accepting Generic Sockets)
편의상, 소켓 승인기(acceptor)의 accept() 및 async_accept() 함수는 해당 프로토콜 변환이 유효한 경우 다른 프로토콜의 소켓 유형으로 직접 승인할 수 있다. 예를 들어, 프로토콜 boost::asio::ip::tcp는 boost::asio::generic::stream_protocol로 변환할 수 있으므로 다음 같은 것이 지원된다:
boost::asio::ip::tcp::acceptor my_acceptor(my_io_context); ... boost::asio::generic::stream_protocol::socket my_socket(my_io_context); my_acceptor.accept(my_socket);
더 보기
generic::datagram_protocol, generic::raw_protocol, generic::seq_packet_protocol, generic::stream_protocol, protocol type requirements(프로토콜 유형 요구사항).
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - 네트워킹 - BSD 소켓 API 및 Boost.Asio (0) | 2020.12.11 |
---|---|
Boost.Asio 개요 - 네트워킹 - 소켓 Iostreams (0) | 2020.12.11 |
Boost.Asio 개요 - 네트워킹 - TCP, UDP 및 ICMP (0) | 2020.12.10 |
Boost.Asio 개요 - 네트워킹 (0) | 2020.12.10 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 코-루틴 TS 지원 (0) | 2020.12.10 |