2014-03-26 5 views
0

리눅스에서는 FIONREAD과 함께 ioctl 호출을 사용하여 다음 UDP 패킷의 바이트 수를 얻을 수 있습니다.BSD 플랫폼에서 다음 UDP 데이터 그램의 크기를 결정 하시겠습니까?

OSX에서는 작동하지 않으며 그 대신 SO_NREAD과 함께 getsockopt 전화를 사용해야 패킷의 바이트 수를 확인할 수 있습니다.

BSD 플랫폼에서 동일한 결과를 얻기 위해 큰 버퍼에 엿보기 또는 읽기를 수행하는 것을 피할 수있는 방법이 있습니까?

답변

2

FIONREAD BSD에서 작동합니다. 사실 그것이 그것이 어디에서 왔는지입니다. 그러나 블로킹없이 읽을 수있는 총 바이트 수는 하나 이상의 데이터 그램이 될 수 있습니다.

EDIT MSG_PEEK | MSG_TRUNC를 사용하고 0의 버퍼 길이를 제공하거나, 그렇지 않으면 버퍼 길이를 제공 할 수 있습니다. 진짜 길이를 돌려 줄거야.

+0

필자가 알고 있듯이 전체 출력 버퍼의 바이트 수를 반환합니다 (헤더 포함). 아직 테스트 할 수 없지만 가까운 미래에 freebsd에서이 테스트를 수행 할 것입니다. – Matt

+0

나는 약간의 시험을했고 여분의 memcpy와 함께 살기로 결정했다. 성능에는 무시할 수있는 차이가 있음이 밝혀졌습니다. 그러나 FIONREAD가 Linux와 동일한 방식으로 작동하는지 알고 싶어하는 사람을 위해 질문을 남겨 둘 것입니다. – Matt

+0

"작동하지 않는다"는 의미입니다. MSG_PEEK | MSG_TRUNC를 사용하고 0의 버퍼 길이를 제공하거나, 그렇지 않으면 버퍼 길이를 제공 할 수 있습니다. 진짜 길이를 돌려 줄거야. – EJP