Linux学堂 2011-06-10
通过读取 /proc/self/net/dev 或者 /proc/net/dev 来得到应用程序流量统计.
获取单个APP流量的方法目前Android没有提供API,但可以同抓包来分析得到pid,从而确定是哪个APP产生的流量。
限制APP访问网络可以用iptables脚本来做到,DroidWallhttp://code.google.com/p/droidwall/ 用的就是iptables脚本+白名单来控制网络访问的。仅是通过/proc/net/dev读取其中的数据.(转载)
#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); } }