2012-09-13 4 views
3

소켓을 통해 전송 된 100 바이트를 고려하십시오. TCP 소켓을 사용하여 recv()을 길이 50으로 호출하면 처음 50 바이트를 얻습니다. 다시 호출하면 두 번째 50 바이트를 얻습니다. UDP 소켓을 사용하여 길이가 50 인 recvfrom()을 호출하면 처음 50 바이트를 얻지 만 다음 데이터 그램이 수신 될 때까지 recvfrom() 블록까지 두 번째 50 - 후속 호출을 검색 할 방법이 없습니다.크기에 관계없이 전체 UDP 데이터 그램을 수신 하시겠습니까?

크기에 관계없이 전체 UDP 데이터 그램을 받고 싶다면 64k 버퍼 (UDP에서 허용하는 최대 값)를 할당해야한다는 의미입니까? UDP 소켓 connect()이 동작을 변경합니까? 또는 UDP를 통해 작동하는 프로토콜은 일반적으로 버퍼에 사용해야하는 알려진 최대 패킷 크기를 수반합니까?

답변

2

UDP 기반 프로토콜이 대부분 MTU보다 적어서 IP fragmentation을 피하기 위해 IP 및 UDP 헤더가 줄어들지 않습니다. 예 : DNS는 512 바이트보다 큰 메시지의 경우 TCP로 전환합니다. 따라서 네트워크에서 점보 프레임을 사용하지 않는 한 1472 바이트의 버퍼 (1500 이더넷 MTU - 옵션없이 IP 헤더의 경우 20 개 - UDP 헤더의 경우 8 개)가 안전 할 수 있습니다. 이것은 물론 UDP 위에있는 응용 프로그램 프로토콜에 따라 다릅니다.

실제로 편집 적이거나 알 수없는 프로토콜로 작업하는 경우 MSG_PEEKMSG_TRUNC 플래그를 사용하여 크기를 먼저 알아 낸 다음 큰 버퍼 (recv(2) 참조)를 할당 할 수 있습니다.

관련 문제