0

この質問は、システムコールpreadとlseekに関するものです。ソケットタイプのファイル記述子があります。パケットがネットワーク層から読み取られるたびに、データが追加されます。一定の間隔でファイル記述子に存在するデータの量を知りたいのですが。

preadとlseekというシステムコールを使ってみたので、データ自体を読み取るのではなく、データの量しかわかりません。しかし、両方の呼び出しが失敗し、不正なシークエラーが発生します。ソケットタイプのファイル記述子に対する他のシステムコールはありますか、またはpreadとlseekはソケットfdでサポートされていませんか?。

最高のヤシュ

4

2 に答える 2

2

Linuxのマンページによると、ソケットインターフェイスはシーク操作をサポートしていません。

ゼロ以外の位置でpread(2)またはpwrite(2)を探したり呼び出したりすることは、ソケットではサポートされていません。

十分なサイズのバッファを指定recvして、以下のフラグを設定して発行してみてください。(MSG_PEEK|MSG_DONTWAIT)

この操作は、ソケットの受信バッファーからデータをコピーしますが、それをポップアウトしません。つまり、後続のrecv/read呼び出しはすべて同じデータを読み取り、さらにいくつかのデータがソケットに到着する可能性があるため、返されるバイト数はさらに多くなる可能性があります。

バッファサイズは非常に厄介な点です。ソケットの受信バッファよりも大きくする必要があります。そうしないと、指定recvしたバッファにあるバイト数がコールで返される可能性がありますが、実際にはソケットにはそれ以上のバイトがあります。

ソケット受信バッファのサイズはgetsockopt、オプション名の関数を使用して取得できますSO_RCVBUF

ところで、私はより良いオプションは実際にデータを読み取り、それをどこかのバッファに保持することだと思います。十分なデータを読み取ったら、それを使用していくつかのアクションを実行します。これは、データを抽出せずにソケット受信バッファーを覗き見するよりも優れた、より一般的なアプローチのようです。

于 2012-08-16T06:45:29.837 に答える
1

ソケットハンドルを探すことはできません。 pread効果的にlseekその後を行いreadます。

呼び出すreadrecv、ループして、そこにあるものを消費するのが最善です。より広範な回答については、このSOの質問を参照してください。

于 2012-08-16T06:44:54.343 に答える