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

📄 lan_ip_deleteuser.c

📁 计费部分源程序。我认为该软件极好
💻 C
字号:
/**************************************************************************************
			融海Intranet用户管理系统
删除用户.
发送给用户管理进程的字符串格式:
userName
当用户管理进程受到该消息后,删除相应的用户,返回成功的消息.
**************************************************************************************/
#include "lan_ip_jf-cgi.h"
char IpDataFile[30] = "ipdata.dat";/*正常传入传出的IP包数据细节文件名称*/
char IpSumDataFile[30] = "ipsumdata.dat";/*正常传入传出的IP包数据总体文件名称*/

FILE* IpDataFptr;/*正常传入传出的IP包数据详细文件指针*/
FILE* IpSumDataFptr;/*正常传入传出的IP包总体数据文件指针*/

#ifdef ANALYZE_BY_IP
/*
将网段地址列表写入一个文件中
*/
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;            
}
/*
判断给定的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;/*缺省返回第一个网段号*/
}
/*
保存一个用户的一天统计数据
*/
void SaveOneUserSumData(FILE* fptr,int month,int day,int groupID,int userID,SumDataType *data1)
{
	SumDataType data,*dataPtr = &data;
	/*1.修改当天的数据*/
	/*注意:以后可用将*32改为向左移5位*/
	/*移动文件指针到相应位置*/
	fseek(fptr,((month-1)*32 + day)*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] += data1->inPackets[i][j];
			data.inPacketsBytes[i][j] += data1->inPacketsBytes[i][j];
			data.outPackets[i][j] += data1->outPackets[i][j];
			data.outPacketsBytes[i][j] += data1->outPacketsBytes[i][j];
		}
	/*重新定位*/
	fseek(fptr,-SumDataSize,SEEK_CUR);
	/*再写入*/
	fwrite(dataPtr,SumDataSize,1,fptr);

	/*2.修改月总数数据*/
	/*移动文件指针到相应位置*/
	fseek(fptr,(month-1)*32*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] += data1->inPackets[i][j];
			data.inPacketsBytes[i][j] += data1->inPacketsBytes[i][j];
			data.outPackets[i][j] += data1->outPackets[i][j];
			data.outPacketsBytes[i][j] += data1->outPacketsBytes[i][j];
		}
	/*重新定位*/
	fseek(fptr,-SumDataSize,SEEK_CUR);
	/*再写入*/
	fwrite(dataPtr,SumDataSize,1,fptr);
	/*将data1中的数据清0*/
	memset(data1,0,SumDataSize);
}
/*
改变当前的日期或时间段
字符串格式:1|month|day
	    2|time stage
若第一个域为1,则表明是日期
若第一个域为2,则表明是时间段
flag==0,保存进入数据
flag== 1,保存外出数据
*/
void ChangeTimeStageOrDate(char* str,int *CurrentMonth,int * CurrentDay,int * CurrentTimeStage,int groupID,int userID,SumdataType* data1)
{
	char str[100];
	char result[20],*startField;
	int flag;
	int month,day,timeStage;
	static int state = 0;

	/*得到标识*/
	startField = GetOneField(str,result);
	flag = atoi(result);
	switch (flag)
	{
		case 1:/*日期发生了变化*/
			startField = GetOneField(startField,result);
			month = atoi(result);
			startField = GetOneField(startField,result);
			day = atoi(result);
			
			if (state == 0)
			{/*若是第一次调用本函数,则不保存数据,因为数据文件的第一行一定是日期行*/
				state = 1;
				*CurrentMonth = month;
				*CurrentDay = day;
				return;
			}
			if ((*CurrentMonth != month) || (*CurrentDay != day))
			{
				/*时间发生变化,将数据保存*/
				SaveOneUserSumData(fptr,*CurrentMonth,*CurrentDay,groupID,userID,data1)
				*CurrentMonth = month;
				*CurrentDay = day;
			}
			break;

		case 2:/*时间段发生了变化*/
			startField = GetOneField(startField,result);
			timeStage = atoi(result);
			if ((timeStage >= TIME_STAGE_1) && timeStage < TIME_STAGE_NUM))
				*CurrentTimeStage = timeStage;
			break;
	}
}

#endif
/*
分析登录文件和IP流量文件
*/
void AnalyzeCurLogAndIPFile(int myGroupID,int myUserID)
{
	int change = 0;
	FILE* fptr,*logFptr,*sumFptr;
	int i;
	char oneStr[200],*logtime;
	char userIDStr[20];
	char groupIDStr[20];
	int userID;
	long inPackets,inPacketsBytes;
	long outPackets,outPacketsBytes;
	long loginTime,logoutTime;
	char str1[50],*str2,*dataPtr;
	char logoutTimeStr[30];
	char logFileName[100],sumFileName[100];
	char fileName[150];
	struct tm * now,*now1;
	int month,day;
	SumDataType sumData,*sumDataPtr = &sumData;

	/*1.分析登录信息文件*/
	/*打开登录细节文件*/
	sprintf(fileName,"%s%s",PATH,IpSumDataFile);
	if ((fptr = fopen(fileName,"r")) == NULL)
	{/*正常传入的IP包数据总体文件指针*/
		PrintError("Don't open file:%s.\n",IpSumDataFile);
		return;
	}
	/*打开用户登录记录文件*/
	sprintf(logFileName,"%s%d/%d",PATH,myGroupID,myUserID);
	if ((logFptr = fopen(logFileName,"a+")) == NULL)
	{

		PrintError("Open File Error:%s.in MaintainSumDataFile().\n",logFileName);
		return;
	}
	/*打开用户统计文件*/
	sprintf(sumFileName,"%s%d/%d%s",PATH,myGroupID,myUserID,SumSuffix);
	if ((sumFptr = fopen(sumFileName,"rb+")) == NULL)
	{
		PrintError("Open File Error:%s.in MaintainSumDataFile().\n",sumFileName);
		return;
	}


	while (!feof(fptr))     
	{
		fgets(oneStr,200,fptr);

		if (feof(fptr))
			break;
		/*1.得到上述各个数据inPackets|inPacketsBytes|outPackets|outPacketsBytes|logout Time*/
		str2 = GetOneField(oneStr,str1);/*timeID*/
		str2 = GetOneField(str2,userIDStr);/*user id*/
		userID = atoi(userIDStr);

		/*若不是该用户的记录则读入下一条记录*/
		if (userID != myUserID)
			continue;
		change = 1;/*找到了该用户的数据*/

		dataPtr = GetOneField(str2,str1);/*ip address*/
		str2 = GetOneField(dataPtr,str1);/*inPackets*/
		inPackets = atol(str1);
		str2 = GetOneField(str2,str1);/*inpackets bytes*/
		inPacketsBytes = atol(str1);
		str2 = GetOneField(str2,str1);/*outPackets*/
		outPackets = atol(str1);
		logtime = GetOneField(str2,str1);/*outpackets bytes*/
		outPacketsBytes = atol(str1);
		#ifdef ZOOM-OP
		inPackets *= ZoomRatio[0];
		inPacketsBytes *= ZoomRatio[0];
		outPackets *= ZoomRatio[1];
		outPacketsBytes *= ZoomRatio[1];
		#endif
		str2 = GetOneField(logtime,str1);/*login time*/
		loginTime = atol(str1);
		str2 = GetOneField(str2,str1);/*logout time*/
		logoutTime = atol(str1);

		/*存入到用户细节文件中*/
		/*处理用户统计文件*/
		/*1。得到月份*/
		now = localtime(&logoutTime);
		sprintf(logoutTimeStr,"%d.%d.%d %d:%d:%d",
			now->tm_year,now->tm_mon+1,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec);
		month = now->tm_mon;
		day = now->tm_mday;
		now1 = localtime(&loginTime);
		/*给logtime赋值实际上就是修改oneStr中的后两个域值*/
		#ifdef ZOOM-OP
		sprintf(dataPtr,"%ld|%ld|%ld|%ld|%d.%d.%d %d:%d:%d|%s\n",
			inPackets,inPacketsBytes,outPackets,outPacketsBytes,
			now1->tm_year,now1->tm_mon+1,now1->tm_mday,now1->tm_hour,now1->tm_min,now1->tm_sec,logoutTimeStr);
		#else
		sprintf(logtime,"%d.%d.%d %d:%d:%d|%s\n",
			now1->tm_year,now1->tm_mon+1,now1->tm_mday,now1->tm_hour,now1->tm_min,now1->tm_sec,logoutTimeStr);
		#endif

		fprintf(logFptr,oneStr);

		
		/*2。读取该用户当月数据*/

		/*将该用户当月数据增加后,再存入*/
		fseek(sumFptr,SumDataSize*month*32,SEEK_SET);
		fread(sumDataPtr,SumDataSize,1,sumFptr);
		/*若按照IP包流量来分析,则关于流量部分不必在本部分处理,但连接时间则要处理*/
		#ifndef ANALYZE_BY_IP
		sumData.inPackets[0][0] += inPackets;
		sumData.inPacketsBytes[0][0] += inPacketsBytes;
		sumData.outPackets[0][0] += outPackets;
		sumData.outPacketsBytes[0][0] += outPacketsBytes;
		#endif
		sumData.connectTime += (logoutTime - loginTime); 

		fseek(sumFptr,-SumDataSize,SEEK_CUR);
		fwrite(sumDataPtr,SumDataSize,1,sumFptr);
		/*将该用户当日数据增加后,再存入*/
		fseek(sumFptr,SumDataSize*(month*32 + day),SEEK_SET);
		fread(sumDataPtr,SumDataSize,1,sumFptr);
		/*若按照IP包流量来分析,则关于流量部分不必在本部分处理,但连接时间则要处理*/
		#ifndef ANALYZE_BY_IP
		sumData.inPackets[0][0] += inPackets;
		sumData.inPacketsBytes[0][0] += inPacketsBytes;
		sumData.outPackets[0][0] += outPackets;
		sumData.outPacketsBytes[0][0] += outPacketsBytes;
		#endif
		sumData.connectTime += (logoutTime - loginTime); 

		fseek(sumFptr,-SumDataSize,SEEK_CUR);
		fwrite(sumDataPtr,SumDataSize,1,sumFptr);

	}
	fclose(logFptr);
	fclose(sumFptr);
	fclose(fptr);

	#ifdef ANALYZE_BY_IP
	/*2.分析IP流量文件*/
	if (!change)
		return;
	else
	{
		struct in_addr srcIp,dstIp;
		struct in_addr *srcIpPtr = &srcIp,*dstIpPtr = &dstIp;
		int inOut;
		SumDataType data;
		int netPartNo = 0,CurrentTimeStage = 0;
		int CuurentMonth,CurrentDay,CurrentTimeStage;

		/*从文件中读取网段列表*/                
		ReadNetPartFile();
		/*打开用户统计文件*/
		sprintf(sumFileName,"%s%d/%d%s",PATH,myGroupID,myUserID,SumSuffix);
		if ((sumFptr = fopen(sumFileName,"rb+")) == NULL)
		{
			PrintError("Open File Error:%s.in MaintainSumDataFile().\n",sumFileName);
			return;
		}

		sprintf(fileName,"%s%s",PATH,IpDataFile);
		if ((fptr = fopen(fileName,"r")) == NULL)
		{/*正常传入的IP包数据细节文件指针*/
			PrintError("Don't open file:%s.\n",IpDataFile);
			return;
		}
		while (!feof(fptr))     
		{
			fgets(oneStr,200,fptr);
			if (feof(fptr))
				break;
			if (oneStr[0] == '*')
			{/*表明这一行为日期或时间段控制信息*/
				ChangeTimeStageOrDate(&oneStr[1],&CurrentMonth,&CurrentDay,&CurrentTimeStage,myGroupID,myUserID,&Data);
				continue;
			}
			/*得到方向0---传入,1---传出*/
			startField = GetOneField(oneStr,result);
			inOut = atoi(result);
			/*得到用户ID*/
			startField = GetOneField(startField,result);
			userID = atoi(result);
			/*若该记录不是本用户的,则读取下一行数据*/
			if (userID != myUserID)
				continue
			/*得到源IP地址*/
			startField = GetOneField(startField,result);
			TransIpAddress(0,result,srcIpPtr);
			/*得到目的IP地址*/
			startField = GetOneField(startField,result);
			TransIpAddress(0,result,dstIpPtr);
			/*得到长度*/
			startField = GetOneField(startField,result);
			length = atol(startField);
			netPartNo = GetNetPartNo(srcIp);
			if (inOut == 0)
			{/*进入包*/
				data.inPackets[CurrentTimeStage][netPartNo]++;
				data.inPacketsBytes[CurrentTimeStage][netPartNo] += legth;
			}
			else
			{/*外出包*/
				data.outPackets[CurrentTimeStage][netPartNo]++;
				data.outPacketsBytes[CurrentTimeStage][netPartNo] += legth;
			}
		}/*while end*/
		SaveOneUserSumData(sumFptr,CurrentMonth,CurrentDay,myGroupID,myUserID,&data);
		fclose(fptr);
		fclose(sumFptr);
	}
	#endif
}
/*
移走用户统计文件和登录记录文件
*/
void MoveUserSumFile(int groupID,int userID)
{
	char command[150];
	
	sprintf(command,"mv -f %s%d/%d%s %sdelete/.",PATH,groupID,userID,SumSuffix,PATH);
/*
cgiPrintf("<br>%s</br>",command);
*/
	system(command);
	sprintf(command,"mv -f %s%d/%d %sdelete/.",PATH,groupID,userID,PATH);
	system(command);
}

/*
删除一个用户成功
字符串格式:userName|groupID|userID
*/
void DeleteUserSuccess()
{
	int groupID,userID;
	char userName[30];
	char result[20];
	char* startField;

	cgiPrintf("<br>");
	cgiPrintf("该用户已经被成功删除!");
	/*1.得到用户ID*/
	startField = GetOneField(CGIInMessage.value,userName);
	startField = GetOneField(startField,result);
	groupID = atoi(result);
	startField = GetOneField(startField,result);
	userID = atoi(result);
	/*2.检查当前IP流量文件和登录记录文件,看是否今天该用户曾经上网*/
	AnalyzeCurLogAndIPFile(groupID,userID);
	/*3.显示该用户总的使用费用*/
	/*显示表头*/
	ShowUserDataTableHead();
	/*显示全年数据*/
	ShowOneUserSumData(groupID,userID,userName,PATH,1);

	cgiPrintf("</TABLE></CENTER>");
	/*4.将该用户的统计文件和登录记录文件移到delete目录下*/
	MoveUserSumFile(groupID,userID);
}
/*
处理从用户进程来的消息
UM---User Managemant
*/
void RecieveMessageFromUM()
{
	int rtn;
	rtn = msgrcv(CGIInMessageID, &CGIInMessage, sizeof(struct msg_scs), pid, 0); 

	if (rtn <= 0)
		exit(1);
	if (CGIInMessage.command==DELETE_USER_SUCCESS)
	{
		DeleteUserSuccess();
		exit(0);
	}
	exit(1);
}
/*
处理发送给用户进程的消息
*/
void SendMessageToUM()
{
	int rtn;
	rtn = msgsnd(CGIOutMessageID, &CGIOutMessage,sizeof (struct msg_scs), 0); 
	if (rtn == 0)
	{
		RecieveMessageFromUM();
		return;
	}
	exit(1);
}

/*
产生错误信息,并返回给用户
*/
void ErrorInfo(int no)
{
	exit(no);
}

/*
主程序开始
参数1:userName
*/
int main(argc,argv)
int argc;
char** argv;
{
	char userName[USER_NAME_LEN];
	char ipAddr[20];
	FILE* userPtr;

	/*得到应用程序所在的路径PATH和本机的IP地址HOSTIP*/
	GetPATHAndHOSTIPFromFile();

	/*检查用户名*/
	TangStrncpy(userName, argv[1],USER_NAME_LEN);
	if (CheckString(userName) == 0)
		exit(1);
	
	/*初始化消息结构*/
	InitMessage();
	/*得到本进程的ID号*/
	pid = getpid();
	/*发送命令给用户管理进程*/
	/*
	发送给用户管理进程的字符串格式:userName
	*/
	CGIOutMessage.mtype = pid;
	CGIOutMessage.command = DELETE_USER;
	sprintf(CGIOutMessage.value,"%s",userName);
	
	SendMessageToUM();
	exit(0);
}

⌨️ 快捷键说明

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