0

winsock では、指定されたサイズ (これは上限にすぎません) に関係なく、ストリーム ソケットで使用可能なデータが存在するとすぐに、同期recvと非同期の両方が完了します。WSARecvこれは、ストリームから一定のバイト数を読み取るために、カスタム バッファリングを適用する必要があることを意味します。また、各読み取りが個別にバッファリングされない限り、ダブル バッファリングが発生します。つまり、ソケットごとに実際には 2 つのバッファがあります。

winsock に代わりにデータをバッファリングし、指定されたバイト数が利用可能になったときにのみ操作を完了するように要求する方法はありますか (エラーが発生しない限り)。

編集:この機能は、特に非同期ソケットで機能するはずです。

4

1 に答える 1

4

同期ソケットの場合、MSG_WAITALL フラグを recv に渡すことができるはずです。これは、バッファーがいっぱいになるか、エラー/切断が発生するまでブロックされます。

重複した io に関しては、そうではありません。唯一の現実的なオプションは、データをバッファリングすることです。ただし、これには実際には 2 つのバッファーは必要ありません。同じバッファーを使用して、バッファーがいっぱいになるまで、バッファー + 最後の読み取りの最後のオフセットを渡すことができます。

于 2009-11-15T22:34:05.453 に答える