UDP 포트로 열린 소켓에 대해 sendto(..)
호출로 전달할 수있는 최대 바이트 수는 어떻게 구합니까?sendto의 최대 버퍼 길이는?
답변
UDP는 연결 지향적이지 않으므로 두 패킷이 함께 속해 있음을 나타내는 방법이 없습니다. 결과적으로 단일 IP 패킷의 최대 크기 (65535)에 의해 제한됩니다. 보낼 수있는 데이터는 IP 패킷 크기에 IP 헤더 (일반적으로 20 바이트)와 UDP 헤더 (8 바이트)가 포함되기 때문에 다소 적습니다.
이 IP 패킷은 더 작은 패킷 (예 : 이더넷의 경우 ~ 1500 바이트)에 맞게 조각화 될 수 있습니다.
나는 이것을 더 이상 제한하는 어떤 OS도 알지 못합니다.
getsockopt()를 사용하십시오. This site에는 사용법 및 검색 할 수있는 옵션이 잘 분류되어 있습니다.
Windows에서 당신이 할 수있는 : Linux의
int optlen = sizeof(int); int optval; getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);
의 UDP man 페이지에 따르면, MTU 검색을 사용하는 커널 (이것은 최대 UDP 패킷 크기는 여기와 대상 사이에 무엇인지 확인합니다 , 선택), MTU 검색이 꺼져 있으면 최대 크기를 인터페이스 MTU로 설정하고 더 큰 값을 조각화합니다. 이더넷을 통해 전송하는 경우 일반적인 MTU는 1500 바이트입니다.
Mac OS X에는 전송 (SO_SNDBUF) 및 수신 (SO_RCVBUF)에 대해 다른 값이 있습니다. 이 송신 버퍼 (남자 getsockopt 함수)의 크기 :
getsockopt 함수 (양말, SOL_SOCKET, SO_SNDBUF (INT의 *) & optval이, & 때문에 optlen);
더 큰 메시지 (로컬 루프백을 통해 보낸 UDP의 Leopard 9216 옥텟)를 보내려고하면 "Message too long/EMSGSIZE"가 표시됩니다.