2011-01-04 12 views
2

Linuxでは、プログラムによって単一のTCP接続の統計情報を取得する方法はありますか?私が探している統計情報は、netstat -sで表示されるソートですが、すべての接続の集合ではなく単一の接続で表示されます。いくつかの例を挙げると、バイトの出入り、再送信、パケットの消失などです。単一接続のNetstat?

ソケットを所有するプロセス内でコードを実行することができ、ソケットファイル記述子を与えることができます。データの送受信に使用されるコードは届かないので、例えば、recv()/send()を数えて/から出るようにする方法はありません。

私はすべての言語で回答を受け付けますが、CやJavaは特にタグに関連しています。

答えて

1

netstat -sで表示されるほとんどの統計情報は、接続ごとに追跡されず、カウンタ全体のみが存在します。あなたは何ができるか

は、/ procの/ネット/ TCP

まず、READLINK()は/ proc /自己/ FDに、あなたはそのシンボリックリンクからiノード番号を解析したいの情報を引き出しており、/proc/net/tcp内の同じinode番号の行と一致させてください。この行には、そのソケット/接続に関する基本的な情報が含まれています。そのファイルはあまり詳しくは書かれていませんが、Googleで時間をかけてLinuxカーネルのソースコードを読んで解釈することを期待しています。

2

情報nosが参照するにはでCから利用されています。これは、特定のLinuxであるとして残念ながら、それはJavaのソケットAPIを介して公開されていない

#include <linux/tcp.h> 
... 
struct tcp_info info; 
socklen_t optlen; 
getsockopt(sd, IPPROTO_TCP, TCP_INFO, &info, &optlen) 

。 rawファイル記述子をソケットから取得する方法がある場合は、これをネイティブメソッドとして実装できます。

私はディスクリプタに到達する方法がありません。しかし、あなた自身のSocketImplFactorySocketImplで可能かもしれません。

それはTCP(7) manual pageは、この再のTCP_INFOを言うことは注目に値しますおそらく:

このオプションは、移植を意図したコードでは使用すべきではありません。
+0

'getsockopt'の5番目のパラメータは、' info'のサイズを保持する 'socklen_t'へのポインタでなければなりません。 –

+0

ありがとう@リチャード・フェーン、私はそれを修正しました。 –

関連する問題