📄 ta_day.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 + -