2

Linuxでは、単一のTCP接続の統計をプログラムで取得する方法はありますか?私が探している統計は、によって出力される種類ですが、netstat -sすべての接続にわたる集約ではなく、単一の接続に対するものです。いくつかの例を挙げます:バイトイン/アウト、再送信、失われたパケットなど。

ソケットを所有するプロセス内でコードを実行でき、ソケットファイル記述子を指定できます。ただし、データを送受信するコードは手の届かないところにあるため、たとえば、recv()/send()バイトイン/アウトをカウントするためにラップする方法はありません。

私はどの言語でも回答を受け入れますが、CまたはJavaが特に関連しているため、タグがあります。

4

2 に答える 2

2

nosが参照する情報は、Cから次の情報を入手できます。

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

残念ながら、これはLinux固有であるため、JavaSocketAPIを介して公開されません。ソケットから生のファイル記述子を取得する方法がある場合は、これをネイティブメソッドとして実装できる可能性があります。

記述子に到達する方法がわかりません。ただし、独自のSocketImplFactoryおよびSocketImplを使用できる場合があります。

TCP(7)のマニュアルページには、TCP_INFOについて次のように記載されていることに注意してください。

このオプションは、移植を目的としたコードでは使用しないでください。
于 2011-01-04T17:44:48.857 に答える
1

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

あなたができることは、/ proc / net/tcpの情報を引き出すことです

まず、/ proc / self / fdのreadlink()で、そのシンボリックリンクからiノード番号を解析し、/ proc / net/tcp内の同じiノード番号の行と照合します。そのソケット/接続。そのファイルは十分に文書化されていませんが、グーグルに時間を費やし、Linuxカーネルのソースコードを読んでそれらを解釈することを期待してください。

于 2011-01-04T15:14:42.500 に答える