2012-02-14 7 views
13

私は受信データを処理しているのを確認するために、私はTCPとUDPソケットでキューの長さを測定したいと思います。UDPソケットのキューされたデータ量を取得するにはどうすればよいですか?

私はSO_RCVBUFソケットオプションを使用してキューサイズを取得できることを知っており、ioctl(<sockfd>, SIOCINQ, &<some_int>)はTCPソケットの情報を教えてくれます。しかしUDPの場合、SIOCINQ/FIONREAD ioctlは次のペンディングデータグラムのサイズだけを返します。 /proc/net/udpのようなシステムテーブルを解析することなく、UDPのキューサイズを取得する方法はありますか?

+4

カーネルがサポートしていないため、この情報を直接取得することはできません。 – ldx

答えて

6

前述のldxと同様に、ioctlまたはgetsockoptではサポートされていません。 現在のSIOCINQの実装は、待機中のバッファ全体を読み込むために必要なバッファ量を決定することを目的としていました(ただし、それはあまり有用ではないと思います。バッファ読み出し)。

このようなシステムコールではサポートされていない他の多くのテレメトリがありますが、通常のプロダクションでは本当の必要はありません。

"netstat -su"でドロップ/エラーをチェックするか、マシン状態を監視したい場合はSNMP(udpInErrors)を使用してチェックすることができます。

BTW:カーネルコードをハックしてこの値(または他の値)を追加するオプションが常にあります。

6

FWIW、異なるプラットフォームでFIONREADの動作をマッピングするためにいくつかの実験を行いました。

のMac OS X、NetBSDの、FreeBSDでは、Solaris版、HP-UX、AIX、Windowsの

プラットフォームどこFIONREADリターン:FIONREAD戻りSOCK_DGRAMソケットで係争中のすべてのデータ

プラットフォーム最初に保留中のデータグラムのバイトのみ:

Linux

ヘッダーやその他のオーバーヘッドバイトがカウントに含まれている実装もあれば、ペイロードバイト数しかカウントされない実装もあります。 LinuxはIPヘッダーを除いて、ペイロードサイズを返すように見えます。

+2

[udp(7)](http://www.kernel.org/doc/man-pages/online/pages/man7/udp.7.html)によると、これはうまくいきません:_ "FIONREAD (SIOCINQ):整数で次のペンディング中のデータグラムのサイズをバイト単位で返すか、データグラムが保留されていないときに0を返す "_ – che

+2

私の悪い点:Linuxでは、' FIONREAD'が* BSDとSolaris。プラットフォームの違いを示すために私の答えを編集します。 –

関連する問題