2010-07-23 4 views
6

boost :: asio는 각 프로토콜에 대해 별도의 끝점 클래스를 정의합니다. 특정 끝점에서 UDP 및 TCP 작업을 모두 수행하려는 경우 짜증나게합니다 (하나에서 다른 것으로 변환해야 함). 난 항상 IP 주소 (v4 또는 v6)와 포트 번호 (TCP 또는 UDP에 관계없이)로 끝점을 생각했습니다. 별도의 수업을 정당화하는 중요한 차이점이 있습니까? 소켓 다르게Boost :: Asio의 tcp :: endpoint와 udp :: endpoint의 차이점은 무엇입니까?

socket(PF_INET, SOCK_STREAM) 

TCP 생성됩니다

답변

4

을 (즉, TCP :: 소켓과 UDP :: 소켓 모두? IP : 엔드 포인트 같은 것을 받아 들일 수), 및

socket(PF_INET, SOCK_DGRAM) 
UDP의 경우

나는 그것이 Boost.Asio에서 다른 유형의 이유라고 생각합니다. 자세한 내용은 man 7 udp 또는 man 7 tcp을 참조하십시오. 질문에 태그를 지정하지 않았으므로 Linux로 가정합니다.

문제를 해결하려면 TCP 끝점에서 IP 및 포트를 추출하고 UDP 끝점을 인스턴스화하십시오.

#include <boost/asio.hpp> 

#include <iostream> 

int 
main() 
{ 
    using namespace boost::asio; 
    ip::tcp::endpoint tcp( 
      ip::address::from_string("127.0.0.1"), 
      123 
      ); 

    ip::udp::endpoint udp(
      tcp.address(), 
      tcp.port() 
      ); 

    std::cout << "tcp: " << tcp << std::endl; 
    std::cout << "udp: " << udp << std::endl; 

    return 0; 
} 

샘플 호출 :

./a.out 
tcp: 127.0.0.1:123 
udp: 127.0.0.1:123 
2

TCP 및 UDP 포트가 다릅니다. 예를 들어 두 개의 개별 프로그램은 TCP를 사용하고 UDP를 사용하는 한 단일 포트에서 수신 할 수 있습니다. 이것이 종점 클래스가 다른 이유입니다.