0

何かが起こったときに、あるプロセスから別のプロセスにUDPソケットを介して1バイトのメッセージが送信されるシステムがあります。受信側では、このイベントが 1 回発生したか、12 回発生したか、100 万回発生したかは問題ではありません。

役に立たない recvfrom() 呼び出しを何度も行うのではなく、setsockopt を使用して SO_RCVBUF を 1 に設定することで、システムが最初のメッセージ以外のすべてを単純に無視するようにすることができるのではないかと考えました (メッセージが読み取られて別のメッセージが許可されるまで)。ただし、グーグルで検索すると、これが 100% 移植可能ではない可能性があるという証拠がいくつか見つかりました (システムによっては、最小サイズを静かに強制しているように見えますか?)。

だから、これを試す作業に入る前に、これがどれくらいうまくいくか知っている人がいるかどうか疑問に思っていました. これは Red Hat Linux の場合です。

4

2 に答える 2

1

Linux では、実際のサイズは と の間で制限されSOCK_MIN_RCVBUFますsysctl_rmem_maxが、 への呼び出しsetsockoptは決して失敗しません。ここを参照してください。これには、とりわけ、 のオーバーヘッドが含まれますstruct sk_buff

の値SOCK_MIN_RCVBUFは次のとおりです。

#define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))

あなたがしたいことについて:私の知る限り、読み取り(またはソケットを閉じる)せずに受信バッファをクリアする方法はありません。

于 2013-02-04T20:27:59.933 に答える
0

SO_RCVBUFアプリケーションデータのバイト単位で測定されると想定しています。UDP の場合、私が知っているどのプラットフォームにもありません。

于 2013-02-04T20:27:05.810 に答える