当前位置: 技术问答>linux和unix
请问在linux下用c语言编程,如何获取网络流量呢?
来源: 互联网 发布时间:2015-11-20
本文导语: 我现在要在linux下编程,实时获取当前网络状况。 我只知道可以在目录/proc/net/dev中可以读取文件内容, 但是具体里面什么流量类型不是很明白。 而且在百度上搜到一段程序,不是太懂,而且头文件没有写全,麻烦...
我现在要在linux下编程,实时获取当前网络状况。
我只知道可以在目录/proc/net/dev中可以读取文件内容,
但是具体里面什么流量类型不是很明白。
而且在百度上搜到一段程序,不是太懂,而且头文件没有写全,麻烦各位帮我看看。谢谢!
http://www.cublog.cn/opera/showart.php?blogid=9551&id=93237
我只知道可以在目录/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包了。
#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可以拿到流量