Linuxのマンページによると、ソケットインターフェイスはシーク操作をサポートしていません。
ゼロ以外の位置でpread(2)またはpwrite(2)を探したり呼び出したりすることは、ソケットではサポートされていません。
十分なサイズのバッファを指定recv
して、以下のフラグを設定して発行してみてください。(MSG_PEEK|MSG_DONTWAIT)
この操作は、ソケットの受信バッファーからデータをコピーしますが、それをポップアウトしません。つまり、後続のrecv
/read
呼び出しはすべて同じデータを読み取り、さらにいくつかのデータがソケットに到着する可能性があるため、返されるバイト数はさらに多くなる可能性があります。
バッファサイズは非常に厄介な点です。ソケットの受信バッファよりも大きくする必要があります。そうしないと、指定recv
したバッファにあるバイト数がコールで返される可能性がありますが、実際にはソケットにはそれ以上のバイトがあります。
ソケット受信バッファのサイズはgetsockopt
、オプション名の関数を使用して取得できますSO_RCVBUF
。
ところで、私はより良いオプションは実際にデータを読み取り、それをどこかのバッファに保持することだと思います。十分なデータを読み取ったら、それを使用していくつかのアクションを実行します。これは、データを抽出せずにソケット受信バッファーを覗き見するよりも優れた、より一般的なアプローチのようです。