私が求めていることは不可能だと思われます。私はフラグMSG_PEEK
でrecv()を呼び出し終わった。これにより、ライブラリーの後続のrecv()またはrecvmsg()呼び出しが同じデータを読み取るようになります。
他の呼び出しがなければ、私は便宜上、1バイトだけを先読みするために使用できます。 2バイト先読みが必要だとしましょう。私はrecv(fd, buf, 2, MSG_PEEK)
と呼ぶだろう。 2バイトのうち1バイトがすでに到着していれば、何回呼び出してもrecvは直ちに戻ります。私はepoll_ctlとEPOLLIN | EPOLLET
を使用して2番目のバイトを待つことができます。その後、EOFがあるかどうかを知りたい場合はEOPLLIN | EPOLLET | EPOLLRDHUP
が必要です。 (EPOLLHUP
はEOFで返されませんのでご注意ください)epoll_ctl
を使用すると、ビジー状態のポーリングループでrecvを呼び出して2番目のバイトを読み取ることを避けることができます。
私はLinuxシステム上で、デフォルトでこの方法で約900 kBのソケットを確認できることを確認しました。 (SO_RECVBUF
は、デフォルトでは私のために1メガバイトであるのsetsockoptでそれを減らすを受信することができますどのくらい減少するようではなく、一貫性のある量だけ。たぶん私は遅すぎるそれを減らす?)MSG_PEEK
の
でも組み合わせとEPOLLET
は、未解決のバイトをソケットに未読で残さないため、回避策です。彼らが私にさせてもらうのは、すでに到着したバイトを消費することなく覗くことです。
出典
2012-01-15 09:01:48
pts
あなたのアプリケーション内のバッファリングでは、Linuxカーネルにそれを要求しないでください。 –
@Basile Starynkevitch:私のユースケースではあなたの提案は不可能です。 *私が制御していない図書館の中で深く発行された*の題を見てください。 – pts
"recv" APIへの呼び出しを制御すると、(なぜBasileが言ったように)自分のバッファリング層でこれらの呼び出しをラップできないのですか?あなたがrecv呼び出しにMSG_PEEKを渡す能力を持っているなら、あなたはrecvの上に独自のラッパーを実装できるはずですか?右? – selbie