免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9723 | 回复: 10
打印 上一主题 下一主题

求助。linux下c编程统计网卡流量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-27 07:20 |只看该作者 |倒序浏览
我知道的方法有:
1 /PROC/NET/DEV文件读取,系统中此文件为空,不可行。
2 读取驱动统计信息, 这个方法比较适合,但是不知道有没有通用的系统api接口函数。在看ethtool源码,但是没有测试成功。
3 ifcofnig源码,找不到interface结构体定义。所以也没有实现。

不能用linux 命令查看,需要调用系统提供的api。

论坛徽章:
0
2 [报告]
发表于 2010-04-27 08:41 |只看该作者
第一种办法使用lipcap抓取包大小,统计
第二种办法使用netfilter进行统计

论坛徽章:
0
3 [报告]
发表于 2010-04-27 08:42 |只看该作者
关于netfilter的示例,参考一下:http://blog.chinaunix.net/u2/89664/showart.php?id=2197652

论坛徽章:
0
4 [报告]
发表于 2010-04-27 10:25 |只看该作者
必须用ethtool, 别整什么filter什么cap。 ethtool的信息是网卡driver提供给你的, 不增加系统负担。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-04-27 13:04 |只看该作者
必须用ethtool, 别整什么filter什么cap。 ethtool的信息是网卡driver提供给你的, 不增加系统负担。
albcamus 发表于 2010-04-27 10:25

我用的是 /proc/net/dev,这个和 ethtool 有区别吗?

论坛徽章:
0
6 [报告]
发表于 2010-04-27 13:58 |只看该作者
回复 5# flw


    应该没区别的,统计值应该就是一份:
  1. struct net_device_stats
  2. {
  3.         unsigned long        rx_packets;                /* total packets received        */
  4.         unsigned long        tx_packets;                /* total packets transmitted        */
  5.         unsigned long        rx_bytes;                /* total bytes received         */
  6.         unsigned long        tx_bytes;                /* total bytes transmitted        */
  7.         unsigned long        rx_errors;                /* bad packets received                */
  8.         unsigned long        tx_errors;                /* packet transmit problems        */
  9.         unsigned long        rx_dropped;                /* no space in linux buffers        */
  10.         unsigned long        tx_dropped;                /* no space available in linux        */
  11.         unsigned long        multicast;                /* multicast packets received        */
  12.         unsigned long        collisions;
  13.         ...
  14. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-04-27 14:03 |只看该作者
ifconfig也是读的/proc

论坛徽章:
0
8 [报告]
发表于 2010-04-29 17:02 |只看该作者
4 楼说的对,必须用ethtool

ifstat 使用原始套接字在二三层之间复制了一份数据帧。

ifconfig、nload 等都是读取 /proc/net/dev文件的。

因为内核裁剪过,此文件为空,所以必须借助ethtool从驱动读取统计信息。

期待高手指点一下。

论坛徽章:
0
9 [报告]
发表于 2010-04-29 19:15 |只看该作者
回复 8# tigerhaha

粗略看了下ethtool源码

ethtool.c -> do_gstats()  这个函数通过ioctl系统调用传输统计信息

对应地,内核里的调用路径是 dev_ioctl() -> dev_ethtool() -> ethtool_get_stats() -> 每个driver自己的ethtool_get_stats()

楼主确定试过但不起作用?

论坛徽章:
0
10 [报告]
发表于 2010-04-29 20:01 |只看该作者
回复 1# tigerhaha


    直接用socket,设置混杂模式,抓包,统计大小不行么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP