?? 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 + -