Boost C++ Libraries/Boost.Asio

Boost.Asio 개요 - 네트워킹 - 기타 프로토콜 지원

까마귀75 2020. 12. 10. 17:12
728x90
반응형

기타 프로토콜 지원 (Support for Other Protocols)

Protocol type requirements(프로토콜 유형 요구사항)을 구현하여 다른 소켓 프로토콜(예: Bluetooth 또는 IRCOMM 소켓)에 대한 지원을 추가할 수 있다. 그러나 대부분의 경우 이런 프로토콜들은 Boost.Asio의 일반적인 지원과 함께 사용될 수 있다. 이를 위해, Boost.Asio는 다음 네 가지 클래스를 제공한다:

이런 클래스는 프로토콜 유형 요구사항을 구현하지만, 사용자가 런타임에 주소 패밀리(예: 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::tcpboost::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.Asio 개요  Boost.Asio 홈

728x90
반응형