Netstat用于单一连接?

时间:2011-01-04 12:29:02

标签: java c networking network-programming netstat

在Linux上,有没有办法以编程方式获取单个TCP连接的统计信息?我正在寻找的统计数据是由netstat -s打印出来的排序,但是对于单个连接而不是在所有连接中的汇总。举一些例子:字节输入/输出,重传,丢包等。

我可以在拥有套接字的进程中运行代码,并且可以给它套接字文件描述符。发送/接收数据的代码虽然无法访问,因此例如,无法将recv()/send()包装为计数字节输入/输出。

我会接受任何语言的答案,但C或Java与标签特别相关。

2 个答案:

答案 0 :(得分:2)

可以从C获得nos引用的信息:

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

不幸的是,由于这是特定于Linux的,因此不会通过Java Socket API公开。如果有办法从套接字获取原始文件描述符,您可以将其作为本机方法实现。

我没有办法找到描述符。但是,您可以使用自己的SocketImplFactorySocketImpl

值得注意的是,TCP(7) manual page表示这是TCP_INFO:

此选项不应用于可移植的代码。

答案 1 :(得分:1)

您在netstat -s中看到的大多数统计信息都没有按每个连接进行跟踪,只有整体计数器存在。

你可以做的是取出/ proc / net / tcp

中的信息

首先,/ proc / self / fd上的readlink(),你要解析该符号链接中的inode号,并将它与/ proc / net / tcp中具有相同inode号的行匹配,其中包含一些关于该套接字/连接的基本信息。虽然没有很好的记录,所以期望在谷歌上花一些时间并阅读linux内核源代码来解释它们。