【问题标题】:Netstat for a single connection?单个连接的Netstat?
【发布时间】:2011-06-03 09:00:05
【问题描述】:

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

我可以在拥有套接字的进程中运行代码,并且可以给它套接字文件描述符。但是,发送/接收数据的代码是遥不可及的,因此无法包装recv()/send() 来计算输入/输出字节数。

我会接受任何语言的答案,但 C 或 Java 尤其相关,因此有标签。

【问题讨论】:

    标签: java c networking network-programming netstat


    【解决方案1】:

    nos 所指的信息可从 C 中获得:

    #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:

    此选项不应在旨在可移植的代码中使用。

    【讨论】:

    • getsockopt 的第 5 个参数应该是指向 socklen_t 的指针,其大小为 info
    【解决方案2】:

    您使用 netstat -s 看到的大多数统计信息都不会针对每个连接进行跟踪,仅存在总体计数器。

    你能做的,就是把/proc/net/tcp里面的信息拉出来

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2015-04-30
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多