ioctl с возвращаемым значением FIONREAD

Этот вопрос связан с Что возвращает FIONREAD сокета udp?

Я пытался использовать следующий код на Mac:

if( ioctl(socketId, FIONREAD, &totalPending) == -1 )
{
printf("%d", totalPending);
}

numBytesRecv = recvfrom(socketId, buffer, maxLen, 0, socketAddress, &socketAddressLen);

На каждый звонок где numBytesRecv != 0, numBytesRecv == totalPending - 16

Не могли бы вы объяснить мне, почему это происходит? Это возвращаемое значение правильно? Если да, могу ли я предположить, numBytesRecv == totalPending - 16 для каждого значения numBytesRecv != 0?

2

Решение

Согласно ответу на этот вопрос, FIONREAD на Mac возвращает размер всех доступных данных в приемном буфере сокета, а НЕ размер следующего ожидающего сообщения. recvfrom() сообщает размер только полезной нагрузки полученного сообщения. Так что вы, вероятно, видите, просто FIONREAD сообщение о дополнительных байтах в буфере приема сокета, которые относятся к сообщениям после следующего ожидающего сообщения. Если вам нужно узнать размер следующего ожидающего сообщения, используйте FIONREAD знать когда звонить recvfrom(), но не надейтесь на FIONREAD чтобы сказать вам реальный размер сообщения. Вместо этого позвоните recvfrom() с MSG_PEEK флаг и большой буфер данных. Возвращаемое значение сообщит вам размер сообщения. Вы можете позвонить recvfrom() опять без MSG_PEEK флаг для получения сообщения и удаления его из буфера приема.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]