2014-02-24 3 views
4

문제점 : net.Read ... 메소드는 주어진 바이트 배열 또는 슬라이스 크기의 바이트 수만 복사합니다. 물론 64kB의 최대 UDP 데이터 그램을 할당하고 싶지는 않습니다.Go : 전체 UDP 데이터 그램을 수신하는 방법

(데이터 그램 헤더에있는) 데이터 그램의 크기를 결정하거나 데이터 그램을 완전히 읽을 때까지 다시 읽는 방법이 있습니까?

+0

구현을 확인하십시오 : 이동은 socket.h가 제공하는 것을 직접 구현합니다. 다른 선택의 여지가 없습니다. – 0x434D53

+0

[여기 C 인터페이스에 대해 같은 질문을하는 또 다른 질문이 있습니다] (http://stackoverflow.com/questions/15446887/udp-read-data-from-the-queue-in-chunks) –

답변

1

ReadFromUDP을 시도

func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error) 

ReadFromUDP는 b에 페이로드를 복사 C에서 UDP 패킷을 판독한다. b에 복사 된 바이트 수와 패킷에있는 반송 주소를 반환합니다.

패킷 크기는 다음에 데이터 그램을 저장하는 사용자 정의 슬라이스 (또는 다른 데이터 구조)를 정의하는 데 사용할 수있는 n에서 사용할 수 있습니다.이 세션 동안 변경되지 않은 데이터 그램의 크기에 의존 , 그것은 정말로해서는 안된다.

+0

문제 : 데이터 그램 크기가 변경되어 OSC (www.opensoundcontrol.org)가 구현됩니다. 내 결정이 아닙니다. 난 야생에서 1,024 바이트보다 큰 OSC 데이터 그램을 본 적이 없지만 이론적으로는 ... – 0x434D53

+0

아니 @ 0x434D53처럼 작동하지 않습니다. 나는 똑같은 것을 찾고 있었다. 내가 필요한 것은 헤더에서 5 번째와 6 번째 바이트입니다. 그것은 최대 65536 - 8입니다 16 비트 숫자입니다. 나는 코드를보고 시간을 보냈지 만 리눅스 내부에 너무 깊이 들어갑니다. 헤더에 8 바이트 만 할당하면 패킷에 실제로 필요한 버퍼 크기를 알 수 있습니다. – tehmoon

0

일반적으로 UDP 프로토콜에서 패킷 크기는 미리 알려져 있으며 일반적으로 1.5k 이하의 순서로 훨씬 작습니다.

모든 작업에 대해 최대 크기의 정적 버퍼를 미리 할당 한 다음 소켓에서 읽은 데이터 그램의 크기를 알면 실제 크기의 바이트 배열을 할당하고 데이터를 복사합니다 . 나는 당신이 같은 데이터 그램을 추가로 읽을 수 있다고 생각하지 않는다.

+0

감사합니다. . 나는 그 하나의 추가적인 복사 단계를 피하고 싶었다. – 0x434D53

관련 문제