linux下获取网络流量的实现方法
2008-03-17 20:50
549 查看
仅是通过/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);
}
}
#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);
}
}
相关文章推荐
- linux下获取网络流量的实现方法
- linux下获取网络流量的实现方法
- Linux进程网络流量统计的实现过程
- linux下实现CPU使用率和内存使用率获取方法
- Linux网络编程:TCP服务器(单进程多用户),使用select方法实现
- 【转】Linux下获取第一个网络接口名称的函数实现
- python 方法无法在线程中使用(附python获取网络流量)
- android--- Linux Proc虚拟文件系统—Android CPU、内存、网络流量获取
- Java实现获取cpu、内存、硬盘、网络等信息的方法示例
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- Python获取linux主机ip的简单实现方法
- android利用Http协议实现从网络上面获取图片的方法
- linux中查看网络流量的方法
- Linux 脚本 实现网络流量监控
- linux系统下 python获取 内存、cpu、负载、网络流量、硬盘等信息
- iOS获取当前网络环境的实现方法(推荐)
- 虚拟化环境下网络流量镜像的一种实现方法
- linux 下获取当前网络连接状态的两种方法
- C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法