2013-09-02 3 views

답변

3
int sock_type; 
socklen_t sock_type_length = sizeof(sock_type); 
getsockopt(socket, SOL_SOCKET, SO_TYPE, &sock_type, &sock_type_length); 

if (sock_type == SOCK_STREAM) { 
    // it's TCP or SCTP - both of which are connection oriented 
} else if (sock_type == SOCK_DGRAM) { 
    // it's UDP - not connection oriented 
} 

내가 스트림 또는 데이터 그램 수있는 다른 프로토콜이있을 수 있으므로이 약간 단순하다 생각하지만,이 코드는 거의 항상 당신이 원하는 것입니다.

+1

SOCK_STREAM은 따라서이 솔루션은 잘못, TCP와 SCTP에 연결할 수 있습니다. –

+0

@OttavioCampana 실례 합니다만? 문제는 그것이 연결 지향적인지 아닌지에 관한 것입니다. SCTP는 연결 지향적입니다. 따라서 솔루션이 괜찮을 것이라고 생각합니다. http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.commadmn%2Fdoc%2Fcommadmndita%2Fsctp_intro.htm – xaxxon

1

here에서 촬영 :

소켓 옵션으로 setsockopt를 사용하여 설정할 수 있습니다

이 소켓 옵션을 (2) getsockopt 함수와 읽기 (2)에 대한 SOL_SOCKET으로 설정 소켓 레벨 모든 소켓 :

...

SO_PROTOCOL (Linux 2.6.32 이후) 소켓 프로토콜을 정수로 검색하여 IPPROTO_SCTP와 같은 값을 반환합니다. 자세한 내용은 socket (2)을 참조하십시오. 이 소켓 옵션은 읽기 전용입니다.

SO_TYPE 소켓 유형을 정수 (예 : SOCK_STREAM)로 가져옵니다. 이 소켓 옵션은 읽기 전용입니다.

가 xaxxon가 제공하는 솔루션을 해결하려면 코드가 있어야한다 :

int sock_type; 
socklen_t sock_type_length = sizeof(sock_type); 
getsockopt(socket, SOL_SOCKET, SO_TYPE, &sock_type, &sock_type_length); 

if (sock_type == SOCK_STREAM) { 
    getsockopt(socket, SOL_SOCKET, SO_PROTOCOL, &sock_type, &sock_type_length); 
    if (sock_type == IPPROTO_TCP) { 
     // it's TCP 
    } else { 
     // it's SCTP 
    } 
} else if (sock_type == SOCK_DGRAM) { 
    // it's UDP 
} 
+0

SO_PROTOCOL 리턴 값 목록은 다음과 같습니다. [here] (http://linux.die.net/include/netinet/in.h) – xaxxon

+0

SO_PROTOCOL은 IPPROTO_TCP와 IPPROTO_UDP를 가질 수 있습니다. 이는 SOCK_STREAM이 SCTP 소켓을 참조 할 수도 있기 때문에 xaxxon이 제공하는 솔루션보다 정확합니다. 당신 che 체리 http://linux.die.net/man/7/sctp –

+0

만약 당신이 sctp를 사용하지 않는다면, 당신은 괜찮을 것입니다. 기본 SOCK_STREAM 프로토콜은 TCP입니다. 또한, 소켓이 연결 지향적인지 아닌지에 대한 질문이있었습니다. 이러한 대답 중 어느 것도 정말로 대답에 해당하지 않습니다. – xaxxon

관련 문제