linux c 获取流量,请问在linux下用c语言编程,如何获取网络流量呢?

我现在要在linux下编程,实时获取当前网络状况。

我只知道可以在目录/proc/net/dev中可以读取文件内容,

但是具体里面什么流量类型不是很明白。

而且在百度上搜到一段程序,不是太懂,而且头文件没有写全,麻烦各位帮我看看。谢谢!

http://www.cublog.cn/opera/showart.php?blogid=9551&id=93237

|

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

void set_timer(int interval){ /* set the timing interval */

struct itimerval itv, oldtv;

itv.it_interval.tv_sec = interval;

itv.it_interval.tv_usec = 0;

itv.it_value.tv_sec = interval;

itv.it_value.tv_usec = 0;

setitimer(ITIMER_REAL, &itv, &oldtv);

}

void time_handle()

{

int i;

printf("bandwidth is %dn",count);

count=0;

}

int main()

{

int sock;

struct ifreq ifstruct;

struct sockaddr_ll sll;

struct sockaddr_in addr;

char buf[2000];

int r;

int len;

len = sizeof(addr);

if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6))) == -1)  //建立socket

{

}

sll.sll_family = PF_PACKET;

sll.sll_protocol = htons(ETH_P_IPV6);

strcpy(ifstruct.ifr_name, "eth1");

ioctl(sock, SIOCGIFINDEX, &ifstruct);

sll.sll_ifindex = ifstruct.ifr_ifindex;

bind(sock,(struct sockaddr*)&sll,sizeof(struct sockaddr_ll));

signal(SIGALRM, time_handle);

set_timer(1);

count=0;

for(; ;)

{

r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);

count+=r;

}

}

这是我编写的很初级的获得当前网络流量的程序,你可以在其中添加内容,就可以获得不同IP源地址的流量信息了。

我编写的是收IPv6包。将ETH_P_IPV6改为ETH_P_IP就可以收IPv4包了。

|

man proc就清楚了。

|

iptables可以拿到流量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值