📄 analyze.c
字号:
/*(8).应被封锁的IP包数据文件名称,BlockIpDataFile 因为有可能仍有一些数据传输.*/
fgets(str,150,fptr);
GetOneField(str,BlockIpDataFile);
/*(9).保存全局变量CurTimeID的文件名称,CurTimeIDFile*/
fgets(str,150,fptr);
GetOneField(str,CurTimeIDFile);
/*得到DLPI设备名称,供lowlevel.c文件使用*/
/*
fgets(str,150,fptr);
GetOneField(str,DLPIDevice);
*/
fclose(fptr);
/*读取网段文件*/
printf("read net part file..\n");
ReadNetPartFile();
/*读取用户帐户文件*/
printf("read user account file.\n");
ReadUserListFromFile(UserFile);
}
/*
从网段列表文件中生成网端地址列表
该文件格式:Net Address|net mask|type
type = 0,主机
type = 1,网络
参数:netPartNo---网段号,filenName----列表文件名
*/
int ReadNetPartListFromFile(int netPartNo,char* fileName)
{
FILE* fptr;
char str[150];
char* str1;
char addr[30];
char result[50];
InternalNetType* netPtr;
if ((fptr = fopen(fileName,"r")) == NULL)
{
PrintError("Don't Open Internal File %s.\n",fileName);
return -1;
}
while (!feof(fptr))
{
fgets(str,150,fptr);
if (feof(fptr))
break;
netPtr = malloc(sizeof(InternalNetType));
if (netPtr == NULL)
{
PrintError("Noe enough memory in GrowInternalNetListFromFile().\n");
fclose(fptr);
return -1;
}
str1 = GetOneField(str,addr);
TransIpAddress(0,addr,&(netPtr->netAddress));
str1 = GetOneField(str1,addr);
TransIpAddress(0,addr,&(netPtr->netMask));
str1 = GetOneField(str1,result);
netPtr->type = atoi(result);/*以后可能要从文件中读取*/
netPtr->flag = 1;/*以后可能要从文件中读取*/
netPtr->next = NetPartList[netPartNo];
NetPartList[netPartNo] = netPtr;
}
fclose(fptr);
}
/*
将网段地址列表写入一个文件中
*/
int WriteInternalNetListToFile(int netPartNo,char* fileName)
{
FILE* fptr;
char addr[30];
char addr1[30];
InternalNetType* netPtr;
if ((fptr = fopen(fileName,"w")) == NULL)
{
PrintError("Don't Open Internal File %s.\n",fileName);
return -1;
}
netPtr = NetPartList[netPartNo];
while (netPtr)
{
TransIpAddress(1,addr,&(netPtr->netAddress));
TransIpAddress(1,addr1,&(netPtr->netMask));
fprintf(fptr,"%s|%s|%d\n",addr,addr1,netPtr->type);
netPtr = netPtr->next;
}
fclose(fptr);
}
/*
根据所给的IP地址和网段链表的表头,在列表中查找是否有匹配的网络或主机
若未找到,则返回NULL
*/
InternalNetType* FindNetPartList(InternalNetType* netPartHead,struct in_addr addr)
{
InternalNetType* netPtr;
netPtr = netPartHead;
while (netPtr)
{
if (netPtr->type ==0)
{/*为网络*/
if ((addr.s_addr&(netPtr->netMask.s_addr)) == netPtr->netAddress.s_addr)
return netPtr;
}
else
{/*为主机*/
if (addr.s_addr == netPtr->netAddress.s_addr)
return netPtr;
}
netPtr = netPtr->next;
}
return NULL;
}
/*
读取网段文件,生成网段链表
NetPart 文件格式:netPartNo|fileName|netPartName
netPartNo:网段号
fileName:该网段地址列表文件
netPartName:网段名
*/
void ReadNetPartFile()
{
int i;
FILE* fptr,fptr1;
char str[150];
char fileName[100];
char result[30],* startField;
int netPartNo;
for (i = 0;i < NET_PART_NUM; i++)
NetPartList[i] = NULL;
if (NET_PART_NUM <= 1)
return;
if ((fptr = fopen(NetPartFile,"r")) == NULL)
{
PrintError("don't open net part file %s\n",NetPartFile);
return;
}
while (!feof(fptr))
{
fgets(str,150,fptr);
if (feof(fptr))
break;
/*得到网段号*/
startField = GetOneField(str,result);
netPartNo = atoi(result);
if ((netPartNo < 0) || (netPartNo >= NET_PART_NUM))
continue;
/*得到文件名*/
startField = GetOneField(startField,fileName);
/*得到网段名字符串*/
startField = GetOneField(startField,NetPartName[netPartNo]);
/*打开网段地址列表文件*/
ReadNetPartListFromFile(netPartNo,fileName);
}
}
/*
判断给定的IP地址在哪个网段中
判断时,查询次序是由大的网段号到小的网段号,所以NET_PART_1为缺省网段,即当查不到网段号时,就将该网段
设置为NET_PART_1,因此该网段最好为"国外网段",因为"国外网段"的号最多,无法判断
在同一网段列表中的判断次序为由后向前.
*/
int GetNetPartNo(struct in_addr ip)
{
int i;
for (i = NET_PART_NUM - 1; i >= 0;i++)
{
if (FindNetPartList(NetPartList[i],ip) != NULL)
return i;
}
return NET_PART_1;/*缺省返回第一个网段号*/
}
/*
从一个字符串中得到一个用户结构指针,若成功返回指针,否则返回NULL
若falg ==0,则字符串格式:userID|userName|userPassword|groupID|remanData|level|flag
若falg ==1,则字符串格式:userID|userName|userPassword|groupID|remainData|level|flag|address Num|Address Type|Ip or Net Address|Net Mask|....
address num:为后面有几个地址,每次地址列表增加个数不能大于5,因此Address Num <= 5
若falg ==2,则字符串格式:userID|userName|userPassword|groupID|remanData|level|addUserDate|flag
*/
UserType* GetOneUserFromStr(char* str,int flag)
{
static UserType tempUser;
static UserType* tempUserPtr = &tempUser;
char result[50];
char* fieldStart;
/*1.得到userID*/
fieldStart = GetOneField(str,result);
tempUser.userID = atoi(result);
/*2.得到userName*/
fieldStart = GetOneField(fieldStart,result);
/*3.得到userPassword*/
fieldStart = GetOneField(fieldStart,result);
/*4.得到groupID*/
fieldStart = GetOneField(fieldStart,result);
tempUser.groupID = atoi(result);
return tempUserPtr;
}
/*
根据用户ID,计算该用户在用户hash表中的索引
返回值为:索引值
*/
int CalcUserIndex(int userID)
{
return userID%USER_HASH_LEN;
}
/*
通过用户ID,在用户列表中查找一个用户,若未找到,返回NULL
*/
UserType* FindUserByID(int userID)
{
int index;
UserType* userPtr;
index = CalcUserIndex(userID);
userPtr = UserAccount[index];
while (userPtr != NULL)
if (userPtr->userID == userID)
return userPtr;
else userPtr = userPtr->nextInHash;
return NULL;
}
/*
生成一个用户记录,若成功返回指针,否则返回NULL
*/
UserType* GrowOneUser(UserType* userSrc)
{
UserType* userDst;
if ((userDst = (UserType*)malloc(sizeof(UserType))) == NULL)
{
PrintError("not enough memory!\nIn GrowOneUser()\n");
return NULL;
}
memcpy(userDst,userSrc,sizeof(UserType));
return userDst;
}
/*
在用户HASH表中增加一个用户
注意:在目前实现中,为检查是否有帐户重复现象,所以在调用本函数前,应调用
FindUserByID()和FindUserByName()函数进行判断
*/
int AddOneUser(UserType* user)
{
int index;
UserType* userPtr;
/*加入HASH表*/
index = CalcUserIndex(user->userID);
user->nextInHash = UserAccount[index];
if (UserAccount[index])
UserAccount[index]->prevInHash = user;
UserAccount[index] = user;
/*键入整个链表*/
if (!UserHead)
{/*当前链表为空*/
UserHead = UserTail = user;
}
else
{
user->prevInList = UserTail;
UserTail->nextInList = user;
UserTail = user;
}
return 1;
}
/*
将用户列表从一个文件中读出
字符串格式:userID|userName|userPassword|groupID|remanData|level|addUserDate|flag|address Num|Address Type|Ip or Net Address|Net Mask|....
address num:为后面有几个地址,每次地址列表增加个数不能大于5,因此Address
*/
int ReadUserListFromFile(char* fileName)
{
FILE* fptr;
char str[150];
UserType* user,*user1;
if ((fptr = fopen(fileName,"r")) == NULL)
{
PrintError("Not Found User File:%s.\n",fileName);
exit(-1);
}
while (!feof(fptr))
{
fgets(str,150,fptr);
if (feof(fptr))
break;
/*1.根据字符串得到一个用户记录*/
user = GetOneUserFromStr(str,2);
if (user)
{
/*2.判断相应的用户ID是否已被使用*/
user1 = FindUserByID(user->userID);
if (user1)
{
PrintError("This User Alway exist!UserID = %d.\n",user->userID);
continue;
}
/*4.生成一个新记录*/
user1 = GrowOneUser(user);
if (user1)
{
/*5.加入到用户链表中*/
AddOneUser(user1);
}
}
}
fclose(fptr);
}
/*
保存一天的数据量,本函数将一天的数据存入统计文件中.
该统计文件的构成:
1.名称:公共路径/groupID/userID.sum
2.大小:12*32*SumDataSize
12-----指12个月,每个月1行
32-----每个月最多31天,此外第0个元素为一个月的总数
3.该文件为二进制文件
4.该文件在增加用户时创建
5.该文件在删除用户时,被移到delete目录中
*/
void SaveOneDayData()
{
UserType* user = UserHead;
FILE * fptr;
char fileName[100];
SumDataType data,*dataPtr = &data;
int i,j;
while (user)
{
if (user->change)
{/*数据发生变化*/
sprintf(fileName,"%s%d/%d.%s",PATH,user->groupID,user->userID,SumSuffix);
if ((fptr = fopen(fileName,"rb+")) == NULL)
{
PrintError("don't open file %s\n",fileName);
continue;
}
/*1.修改当天的数据*/
/*注意:以后可用将*32改为向左移5位*/
/*移动文件指针到相应位置*/
fseek(fptr,((CurrentMonth-1)*32 + CurrentDay)*SumDataSize,SEEK_SET);
/*读取文件中的数据*/
fread(dataPtr,SumDataSize,1,fptr);
/*修改数据*/
for (i = 0; i < TIME_STAGE_NUM; i++)
for (j = 0; j < NET_PART_NUM; j++)
{
data.inPackets[i][j] += user->data.inPackets[i][j];
data.inPacketsBytes[i][j] += user->data.inPacketsBytes[i][j];
data.outPackets[i][j] += user->data.outPackets[i][j];
data.outPacketsBytes[i][j] += user->data.outPacketsBytes[i][j];
}
/*重新定位*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -