Этот вопрос связан с Что возвращает 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
?
Согласно ответу на этот вопрос, FIONREAD
на Mac возвращает размер всех доступных данных в приемном буфере сокета, а НЕ размер следующего ожидающего сообщения. recvfrom()
сообщает размер только полезной нагрузки полученного сообщения. Так что вы, вероятно, видите, просто FIONREAD
сообщение о дополнительных байтах в буфере приема сокета, которые относятся к сообщениям после следующего ожидающего сообщения. Если вам нужно узнать размер следующего ожидающего сообщения, используйте FIONREAD
знать когда звонить recvfrom()
, но не надейтесь на FIONREAD
чтобы сказать вам реальный размер сообщения. Вместо этого позвоните recvfrom()
с MSG_PEEK
флаг и большой буфер данных. Возвращаемое значение сообщит вам размер сообщения. Вы можете позвонить recvfrom()
опять без MSG_PEEK
флаг для получения сообщения и удаления его из буфера приема.
Других решений пока нет …