⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyze.c

📁 计费部分源程序。我认为该软件极好
💻 C
📖 第 1 页 / 共 3 页
字号:
	/*(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 + -