分享
 
 
 

基于中软Linux实现代理服务器与防火墙(2

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

作者:李宇

流量统计

流量统计使用ntop提供的统计功能来实现。ntop在统计过程中,会在内存中创建一个数据列表,即时更新数据信息。同时,它提供定时向数据库中发送相关数据的功能,时间间隔可以在编译前设置。我们可以根据实际需要定义ntop统计的数据。利用ntop提供的向MySQL数据库中更新数据的方法,定期存储数据到备份数据库表中。定期存储数据的功能使用select _test.c实现,同时刷新内存中ntop流量值及ntop默认数据库表。

有了保存于MySQL数据库中的统计数据,通过来用PHP编写动态网页,完成数据库中数据的查询和统计。具体的实现方法比较简单。如果需要了解如何构建Apache+MySQL+PHP完成流量查询,可以在很多Linux技术交流网站查找到相关的技术文档。

由于ntop记录的信息非常详细,有些协议是很少使用的,或是产生的流量比较少,可以忽略不计,所以我们要对ntop记录的数据做一调整。

以下所做的工作有简化数据表结构(保留我们需要的字段,简化保存的数据);创建备份数据库表test;修改ntop源代码中的sql.c,简化默认的ntop向MySQL数据库中添加的数据;编写数据库表数据的备份程序;设定ntop对数据库的刷新时间,保证刷新内存的时间小于我们设定的循环时间(参见ntop.h);将网卡设置为非混杂模式;编写脚本完成循环统计功能。

简化后的数据表结构(mySQLdefs.txt)

CREATE TABLE IPtraffic

(

IPaddress CHAR(16) NOT NULL,

TCPsentRemotely INT,

TCPrcvdFromRemote INT,

UDPsentRemotely INT,

UDPrcvdFromRemote INT,

PRIMARY KEY (IPaddress)

);

CREATE TABLE NameMapper

(

IPaddress CHAR(16) NOT NULL,

Name CHAR(50),

PRIMARY KEY (IPaddress)

);

创建备份数据库表test

Field Type Null Key Default Extra

IPaddress varchar(20) YES NULL

data int(11) YES NULL

dates date YES NULL

修改ntop源代码中的sql.c

例如:

if(snprintf(sqlBuf, SQL_BUF_LEN, "UPDATE IPtraffic SET "

"TCPSentRemotely = %llu,"

"TCPrcvdFromRemote = %llu,"

"UDPSentRemotely = %llu,"

"UDPrcvdFromRemote = %llu"

"WHERE IPaddress = '%s'",

(el-tcpSentRemotely),

(el-tcpReceivedFromRemote),

(el-udpSentRemotely),

(el-udpReceivedFromRemote),

el-hostNumIpAddress)

sendto(sqlSocket, sqlBuf, strlen(sqlBuf), 0, (struct sockaddr *)&dest,

sizeof(dest));

将需要的字段保留,其它的去除!

编写数据库表数据的备份程序select_test.c的编译程序(编译时运行make)

Makefile :

#This is a Makefile for select_test.c

CC = gcc

INCLUDE = -I/usr/include/mysql

LIBPATH = -L/usr/lib/mysql

LLIB = -lmysqlclient

select_test:select_test.c

$(CC) -o select_test select_test.c $(INCLUDE) $(LIBPATH) $(LLIB)

数据库表数据备份程序select_test.c:

#include

#include

#include "mysql.h"

#include

#include

#define SELECT_QUERY"select

IPaddress,(UDPrcvdFromRemote+UDPsentRemotely+TCPrcv

dFromRemote+TCPsentRemotely) as data from IPtraffic where IPaddress like

\"%s\" or IPaddress like \"%s\""

#define INSERT_QUERY "insert into test (IPaddress,data,dates) values

(\"%s\",%d,\"%s\")"

#define TEST_QUERY "select dates from test where dates=\"%s\""

/*获取当前日期*/

getdates(char *currentdate)

{

struct timeval datetemp;

struct tm * datetemp1;

gettimeofday(&datetemp,(void *)NULL);

datetemp1 = localtime(&(datetemp.tv_sec));

sprintf(currentdate,"%d-%02d-%02d",datetemp1-tm_year+1900,datetemp1-tm_mon+1,

datetemp1-tm_mday);

}

int main(int argc, char **argv)

{

unsigned int num_fields;

unsigned int i;

int count,num,charge;

MYSQL mysql,*sock;

MYSQL_RES *res;

MYSQL_FIELD **fields;

MYSQL_ROW row;

char selectqbuf[1024];

char insertqbuf[1024];

char testqbuf[512];

char currentdate[11];

currentdate[10] = 0;

if (argc != 3)

{

fprintf(stderr,"usage : select_test \n\n");#设定需要统计的网段

exit(1);

}

mysql_init(&mysql);

if (!(sock= mysql_real_connect(&mysql,NULL,0,0,"NTOP",0,NULL,0)))

{

fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));

perror("");

exit(1);

}

/* IN NTOP databases,if have some recorders same as currentdate,don't in

sert them to data`table*/

getdates(currentdate);

charge=1;

sprintf(testqbuf,TEST_QUERY,currentdate);

if(mysql_query(sock,testqbuf))

{

fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));

exit(1);

}

if (!(res=mysql_store_result(sock)))

{

fprintf(stderr,"Couldn't get result from %s\n",

mysql_error(sock));

exit(1);

}

i=mysql_num_rows(res);

if (i==-1)

{

printf("couldn't run test select with currentdate\n");

}

if ((i!=0)&&(i!=-1))

{

charge=0;

printf("IN test table,having

some recorders included currentdate,error!\n");

exit(1);

}

mysql_free_result(res);

mysql_close(sock);

if(!(sock= mysql_real_connect(&mysql,NULL,0,0,"NTOP",0,NULL,0)))

{

fprintf(stderr,"Couldn't connect to

engine!\n%s\n\n",mysql_error(&mysql));

perror("");

exit(1);

}

/#sleep(100)#/

sprintf(selectqbuf,SELECT_QUERY,argv[1],argv[2]);

if(mysql_query(sock,selectqbuf))

{

fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));

exit(1);

}

if (!(res=mysql_store_result(sock)))

{

fprintf(stderr,"Couldn't get result from %s\n",

mysql_error(sock));

exit(1);

}

while ((row=mysql_fetch_row(res))&&charge)

{

num=atoi(row[1]);

sprintf(insertqbuf,INSERT_QUERY,row[0],num,currentdate);

mysql_query(sock,insertqbuf);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有