您的位置:首页 > 理论基础 > 计算机网络

linux下获取网络流量的实现方法

2012-01-12 16:12 375 查看
http://y150988451.iteye.com/blog/1075461

通过读取 /proc/self/net/dev 或者 /proc/net/dev 来得到应用程序流量统计.

获取单个APP流量的方法目前Android没有提供API,但可以同抓包来分析得到pid,从而确定是哪个APP产生的流量。

限制APP访问网络可以用iptables脚本来做到,DroidWallhttp://code.google.com/p/droidwall/ 用的就是iptables脚本+白名单来控制网络访问的。仅是通过/proc/net/dev读取其中的数据.(转载)


JAVA:

#include

#include

#include

void skipline(FILE *f)

{

int ch;

do {

ch = getc(f);

} while ( ch != 'n' && ch != EOF );

}

int main(int argc, char *argv[])

{

FILE *pnd;

char buffer[BUFSIZ];

char *interface;

struct ifinfo {

char name[8];

unsigned int r_bytes, r_pkt, r_err, r_drop, r_fifo, r_frame;

unsigned int r_compr, r_mcast;

unsigned int x_bytes, x_pkt, x_err, x_drop, x_fifo, x_coll;

unsigned int x_carrier, x_compr;

} ifc;

unsigned long long bin, bout, lbin, lbout;

int first;

if ( argc != 2 ) {

fprintf(stderr, "Usage: %s interfacen", argv[0]);

exit(1);

}

interface = argv[1];

first = 1;

lbin = 0; lbout = 0;

while ( 1 ) {

pnd = fopen("/proc/net/dev", "r");

if ( !pnd ) {

fprintf(stderr, "%s: /proc/net/dev: %s", argv[0], strerror(errno));

exit(1);

}

/* Skip header */

skipline(pnd);

skipline(pnd);

/* Get interface info */

do {

if ( fscanf(pnd, " %6[^:]:%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",

&ifc.name,

&ifc.r_bytes, &ifc.r_pkt, &ifc.r_err, &ifc.r_drop,

&ifc.r_fifo, &ifc.r_frame, &ifc.r_compr, &ifc.r_mcast,

&ifc.x_bytes, &ifc.x_pkt, &ifc.x_err, &ifc.x_drop,

&ifc.x_fifo, &ifc.x_coll, &ifc.x_carrier, &ifc.x_compr)

!= 16 ) {

exit(200);

}

skipline(pnd);

} while ( strcmp(ifc.name, interface) );

bin = ifc.r_bytes + (lbin & ~0xffffffffULL);

bout = ifc.x_bytes + (lbout & ~0xffffffffULL);

if ( bin < lbin )

bin += (1ULL << 32);

if ( bout < lbout )

bout += (1ULL << 32);

if ( !first ) {

printf("%d %Lu %Lun", time(NULL), (bout-lbout)*8, (bin-lbin)*8);

fflush(stdout);

} else {

first = 0;

}

lbin = bin; lbout = bout;

fclose(pnd);

sleep(1);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: