2

この質問は、udp ソケットの FIONREAD は何を返しますか? に関連しています。

Macで次のコードを使用しようとしました:

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

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

すべての呼び出しでnumBytesRecv != 0numBytesRecv == totalPending - 16

なぜこれが起こるのか説明してもらえますか?この戻り値は正しいですか? numBytesRecv == totalPending - 16はいの場合、すべての値について仮定してもnumBytesRecv != 0よろしいですか?

4

1 に答える 1

4

この質問への回答によるとFIONREAD、Mac では、次の保留中のメッセージのサイズではなく、ソケットの受信バッファーで使用可能なすべてのデータのサイズを返します。 recvfrom()受信メッセージのペイロードのサイズのみを報告します。FIONREADそのため、次の保留中のメッセージの後のメッセージに関連するソケットの受信バッファー内の追加のバイトを報告するだけである可能性があります。次の保留中のメッセージのサイズを知る必要がある場合は、をいつ呼び出すFIONREADかを知るために使用しますが、実際のメッセージ サイズの通知に依存しないでください。代わりに、フラグと大きなデータ バッファーを指定して呼び出します。戻り値は、メッセージ サイズを示します。その後、なしで再度呼び出すことができますrecvfrom()FIONREADrecvfrom()MSG_PEEKrecvfrom()MSG_PEEKメッセージを受信し、受信バッファから削除するためのフラグ。

于 2013-09-24T19:58:39.400 に答える