2009-12-23 3 views
15

IPPROTO_UDP는 언제 필요합니까?IPPROTO_UDP는 언제 필요합니까?

UDP가 이 아닌 경우도 있습니까?은 SOCK_DGRAM의 기본 프로토콜입니까?

즉, 다음 두 줄이 하지 동일한 동작을 생성 할 상황은 무엇인가 (실제 사례, 가상하지 ", 제발"그것은 수 있습니다 ")

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1) 

답변

12

을 감안할 때 이러한 선언 :

tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 
udp_socket = socket(AF_INET, SOCK_DGRAM, 0); 
raw_socket = socket(AF_INET, SOCK_RAW, protocol); 

리눅스에서 ip(7) 매뉴얼 페이지는 말한다 :

프로토콜의 유효한 값은 0 및 TCP 소켓의 경우 IPPROTO_TCP이고 UDP 소켓의 경우 0 및 IPPROTO_UDP입니다. SOCK_RAW의 경우 RFC 1700 에 정의 된 유효한 IANA IP 프로토콜을 지정할 수 있습니다.

질문에있는 두 줄은 항상 동일한 결과를 산출합니다.

+0

'IPPROTO_UDP' intsead를 사용하면 모든 헤더를 채워야하는 소켓을 얻는 것과 같은 결과가 아닐 수 있습니다. – WilliamKF

14

일부 운영 체제 (예 : 2.6.20 이후의 Linux 커널)는 UDP-Lite라고하는 SOCK_DGRAM의 두 번째 프로토콜을 지원합니다. 시스템에서 지원하는 경우 socket() 호출의 세 번째 인수로 IPPROTO_UDPLITE를 제공하여 활성화 할 수 있습니다.

데이터 그램의 일부에만 체크섬을 적용하여 일반 UDP와 구별됩니다. (일반적으로 UDP checksumming은 all-or-nothing 노력입니다.) 이렇게하면 checksummed 영역 밖의 일부 조각이 전송 중에 손실되었을 수있는 경우 프로토콜이 조각화 된 전송으로 인해 체크섬 실패에보다 강력해질 수 있습니다. 체크섬 된 부분을 포함하는 조각이 성공적으로 수신되는 한 가능한 한 많은 데이터 그램이 여전히 응용 프로그램에 전달됩니다.

기존 코드와의 하위 호환성을 위해, UDP-Lite를 추가로 지원하는 시스템에서도 콜 소켓 (AF_INET, SOCK_DGRAM, 0)이 일반 UDP로 기본 설정을 계속 유지할 것이라고 생각합니다.

관련 문제