2010-07-20 5 views
10

이 함수에서 사용할 수있는 기본 최대 버퍼 크기는 65507 (5535 - IPv4 헤더 - UDP 헤더)입니다. 그러나 이것을 바꿀 수있는 방법이 있습니까? 나는 더 큰 버퍼 ~ 66000 바이트를 보낼 수 있어야한다. setsockopt() 함수를 사용하여 시도했지만 작동하지 않았다.UDP sendto() 및 recvfrom() 최대 버퍼 크기

감사합니다.

+0

버퍼를 분할 할 수 없습니까? 추가 비트로 태그를 지정하여 순서를 알 수 있습니까? – Scharron

+0

이런 계획을 세워야 할 것 같습니다. –

+1

5535는 65535이어야합니다. – kumar

답변

12

UDP는 단지 IP 패킷의 데이터 부로서 데이터 그램을 제공

는 IP 패킷 따라서 헤더를 포함한 2^16 바이트, 또는 대 65,507 바이트 데이터를 제한하는 16 비트 길이의 필드를 갖는다 UDP 데이터 부분 (ipv4 옵션이 없다고 가정)을 사용하면 UDP로 더 큰 패킷을 처리 할 수있는 방법이 없으며 여러 패킷으로 분할하고 재 조립 등을 직접 처리 할 수 ​​있습니다.

+0

설명해 주셔서 감사합니다. 대신 TCP 제안에 대한 –

6

UDP 사양은 패킷 크기에 대해 UDP 헤더에서 16 비트를 제공합니다. 즉, 한 번에 65k를 초과하여 보낼 수 없습니다. 너는 이것을 바꿀 수 없다.

데이터를 여러 패킷으로 분할해야합니다. UDP 대신 TCP를 사용하면 완성도와 수신 순서가 보장되기 때문에 훨씬 간단 해집니다. 포장의 IP 패킷 인해 MTU 한계를 세분화 할 수 있기 때문에

+1

+1. – Matt

8

또한 길을 따라 "큰"UDP 패킷을 느슨하게하는 것은 매우 가능성이 높습니다. 각 조각은 손실 될 수 있으며 UDP에는 복구 메커니즘이 없습니다. 따라서 UDP 페이로드에 대한 이론적 인 제한은 약입니다. 실제 한계는 약 1kB입니다.

+4

이것은 중요한 포인트입니다. 이더넷 크기의 조각으로 단편화 65,500 바이트의 UDP 패킷은 ~ 37 % UDP 패킷 손실율로 1 % 기본 단편 손실률 바뀔 것이다. 큰 UDP 패킷 -하지 마! 나는 우리 일을 – caf

+0

은 (정기적 인 ARP이 저하 방지하고 정적 ARP 항목) 큰 패킷과 UDP 트래픽에 대한 개인 서브넷에 전용 인터페이스를 사용하여이 문제를 해결하기. 당신은하지만 그렇게 할 수없는 경우, 손실 된 패킷에 대비. –