Я хочу знать размер следующей UDP-дейтаграммы в очереди системы.
Я нашел этот вопрос с аналогичным сомнением, но с использованием форсирования.Последний ответ (по состоянию на 2010/09/23) что-то говорит об использовании getsockopt
с параметром SO_NREAD
в OS X, но я ничего не могу найти по этому поводу в Windows (используя Winsock).
Здесь Я обнаружил, что могу использовать ioctlsocket
с FIONREAD
, чтобы узнать, каков размер всей очереди, но я ничего не нашел в первой дейтаграмме.
Итак, мой вопрос: Есть ли способ определить, каков размер следующей UDP-дейтаграммы в очереди с помощью API сокетов? (я не использую boost).
Я хочу, чтобы мой код выглядел так:
char BigBuffer[ 64 * 1024 ];
void Read( void *Buf, size_t Size ) {
size_t LengthInQueue = WhatTheSizeOfTheNextDatagram();
if( Size < LengthInQueue ) {
recvfrom( Socket, BigBuffer, 64*1024, /*...*/ );
memcpy( Buf, BigBuffer, Size );
}
else {
recvfrom( Socket, Buf, size, /*...*/ );
}
}
Я упустил проверку ошибок и некоторые параметры ради пространства и читабельности.Я хочу избежать копирования в промежуточный буфер, когда он не нужен.