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

📄 ta_day.h

📁 计费部分源程序。我认为该软件极好
💻 H
字号:
#include "myfunction.h"
/*
转换IP地址,从字符串到in_addr结构,或相反
flag = 0, from string to struct
flag = 1, from struct to string
*/
void TransIpAddress(int flag ,char* str,struct in_addr *ip)
{
	int tmp[4];

	if (flag == 0)
	{
		sscanf(str,"%d.%d.%d.%d",&tmp[0],&tmp[1],&tmp[2],&tmp[3]);
		(ip->s_net) = tmp[0];
		(ip->s_host) = tmp[1];
		(ip->s_lh) = tmp[2];
		(ip->s_impno) = tmp[3];
	}
	else
	{
		sprintf(str,"%d.%d.%d.%d",
					ip->s_net,
					ip->s_host,
					ip->s_lh,
					ip->s_impno);
	}
}
/*
从一个字符串中得到第一个域,该域不含空白字符
返回值:为输入字符串中第一个域后的第一个字符的指针
*/
char* GetOneField(char* str,char* result)
{
	char* ch1,*ch2,*ch3;
	ch1 = str;
	while (*ch1 == ' ' || *ch1 =='\t')
		ch1++;
	ch2 = ch1;
	ch3 = result;
	while ((*ch2 != '|') &&(*ch2 != '#') && (*ch2 != ' ') && (*ch2 != '\t') && (*ch2 != '\n') && (*ch2 != '\r') && (*ch2 != 0))
	{
		*ch3 = *ch2;
		ch2++;
		ch3++;
	}
	*ch3 = 0;
	while ((*ch2 != '|') && (*ch2 != '\0'))
		ch2++;
	ch2++;
	return ch2;
}

/*
从一个字符串中得到一个用户结构指针,若成功返回指针,否则返回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;
	AddressType* addr;
	int addrNum,addrType;
	struct in_addr ipAddr,netMask;
	long addUserDate;

	/*1.得到userID*/
	fieldStart = GetOneField(str,result);
	tempUser.userID = atoi(result);
	/*2.得到userName*/
	fieldStart = GetOneField(fieldStart,result);
	TangStrncpy(tempUser.userName,result,USER_NAME_LEN);
	/*3.得到userPassword*/
	fieldStart = GetOneField(fieldStart,result);
	TangStrncpy(tempUser.userPassword,result,USER_PASS_LEN);
	/*4.得到groupID*/
	fieldStart = GetOneField(fieldStart,result);
	tempUser.groupID = atoi(result);
	/*5.得到remainData*/
	fieldStart = GetOneField(fieldStart,result);
	tempUser.remainData = atol(result);
	/*6.得到level*/
	fieldStart = GetOneField(fieldStart,result);
	tempUser.level = atoi(result);

	/*7.得到flag*/
	if (flag == 2)
	{/*从字符串中得到用户被加入的时间*/
		fieldStart = GetOneField(fieldStart,result);
		tempUser.addUserDate = atol(result);
	}
	else
	{/*当前时间为用户被加入的时间*/
		time(&tempUser.addUserDate);
	}

	/*8.得到flag*/
	fieldStart = GetOneField(fieldStart,result);
	tempUser.flag = atoi(result);
	if (flag == 1)
	{
		/*5.若flag&LIMIT_LOGIN_LOCATION==TRUE,则读取地址列表*/
		if (flag & LIMIT_LOGIN_LOCATION)
		{
			fieldStart = GetOneField(fieldStart,result);
			addrNum = atoi(result);
			if (addrNum >5)/*每次地址列表增加个数不能大于5*/
				addrNum = 5;
			while (addrNum > 0)
			{
				/*得到地址类型*/
				fieldStart = GetOneField(fieldStart,result);
				addrType = atoi(result);
				/*得到IP or Net地址*/
				fieldStart = GetOneField(fieldStart,result);
				TransIpAddress(0,result,&ipAddr);
				if (addrType != HOST_TYPE)
				{/*得到Net Mask*/
					fieldStart = GetOneField(fieldStart,result);
					TransIpAddress(0,result,&netMask);
				}
				/*生成地址列表*/
				addr = (AddressType*)malloc(sizeof(AddressType));
				if (addr)
				{
					addr->type = addrType;
					addr->addr.s_addr = ipAddr.s_addr;
					addr->netMask.s_addr = netMask.s_addr;
					addr->prev = NULL;
					addr->next = tempUserPtr->allowLoginAddressList;
					if (tempUserPtr->allowLoginAddressList)
						tempUserPtr->allowLoginAddressList->prev = addr;
					tempUserPtr->allowLoginAddressList = addr;
				}
				else
				{
					PrintError("Not enough memory!ModifyFlag()");
					break;
				}
				addrNum--;
			}       
		}

	}
	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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -