如何获得Linux / Mac OSX中的networking适配器统计信息?

我正在寻找一种方法来获得在Linux和MacOSX的Cnetworking统计信息。 具体来说,我需要监视系统中每个networking适配器上传和下载的字节数 – 我不需要做数据包检查,也不需要区分协议,只需要一个“总字节数”的计数器,我可以间隔地进行轮询没事的。 在Windows中,我可以通过GetIfTable(列出networking适配器)和GetIfEntry(读取统计信息)使用iphlpapi.dll库来完成此操作,但找不到Linux / OSX等价物。 我对C的知识是相当基础的,所以我希望能有一个不太涉及的解决scheme。 任何帮助将非常感激!

Darwin的netstat源代码使用sysctl。 以下是一些打印OSX中输入和输出字节数的代码:

#import <Foundation/Foundation.h> #include <sys/sysctl.h> #include <netinet/in.h> #include <net/if.h> #include <net/route.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int mib[] = { CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST2, 0 }; size_t len; if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { fprintf(stderr, "sysctl: %s\n", strerror(errno)); exit(1); } char *buf = (char *)malloc(len); if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { fprintf(stderr, "sysctl: %s\n", strerror(errno)); exit(1); } char *lim = buf + len; char *next = NULL; u_int64_t totalibytes = 0; u_int64_t totalobytes = 0; for (next = buf; next < lim; ) { struct if_msghdr *ifm = (struct if_msghdr *)next; next += ifm->ifm_msglen; if (ifm->ifm_type == RTM_IFINFO2) { struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm; totalibytes += if2m->ifm_data.ifi_ibytes; totalobytes += if2m->ifm_data.ifi_obytes; } } printf("total ibytes %qu\tobytes %qu\n", totalibytes, totalobytes); [pool drain]; return 0; } 

在Linux上:

  • 低级别:检查/sys/class/net/eth0/statistics/
  • 稍高的级别: ip -s link show eth0
  • 图形: iftop
  • 交互式: iptraf

我不能说OSX,但在Linux上看看/ proc / net / dev。

如果你做'cat / proc / net / dev',你应该看到统计数据包括'bytes' – 接口传输或接收的数据的总字节数。 您可以在自己的程序中读取文件。

编辑:

我没有看完你的整个问题。 本文将帮助您开始使用/ proc,并在/ proc / net / dev上有一个部分。

另外,要列出接口,您可以使用SIOCGIFCONF选项调用ioctl 。 您可以在Google上找到一个体面的代码示例,了解如何循环返回的数据。 或者你可以简单地将它从上面提到的/proc.net/dev数据中提取出来,这应该会更容易些。