2009-04-30 6 views
0

Linux에서 원시 소켓 수신 버퍼의 대기중인 옥텟 수를 확인하기 위해 ioctl (FIONREAD)을 사용하는 구현이 있으며 그 다음에 recv를 호출합니다.Linux의 원시 소켓에 ioctl FIOREAD

Linux의 원시 소켓 용 ioctl 인터페이스가 실제 보류중인 옥텟을 실제로 반환하지 않는다는 것을 읽었습니다. 이 올바른지?

지금은 부하가 높을 때마다 메시지를 잃어 버리고 지금까지 어디에서 찾을 수 있었기 때문에 물어 봅니다. 원시 소켓에서 대기중인 옥텟의 수를 파악하는 더 나은 방법입니다.

답변

1

응용 프로그램이 패킷 속도를 따라 잡을 수없는 경우 (커널 버퍼가 제한되지 않기 때문에) 항상 커널이 패킷을 삭제할 가능성이 있습니다.

왜, 왜 옥텟의 수를 알아야합니까? 패킷 소켓이므로 패킷의 길이는 네트워크 인터페이스의 최대 프레임 크기에 의해 항상 제한되므로 recv에 충분한 크기의 버퍼를 전달하십시오.

성능이 중요한 경우 Linux에서 PACKET_MMAP 지원을 조사해야합니다.

+0

내가 구현 한 작업은 ioctl 시스템 호출을 사용하여 읽지 않은 패킷 수를 확인합니다. 나는 그것을 2048 년에 하드 코드로 바꾸었고 더 이상 패킷 손실이 보이지 않습니다. 감사. –