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

📄 admserver.cc

📁 此源代码只用于学习,不得用于其他商业活动 .
💻 CC
📖 第 1 页 / 共 3 页
字号:
			Reply,
			"@%lu@%lu\0",
			ulTotalBlocks,
			ulAvailBlocks
			);
	}
	else
	{
		strcpy(Reply,"@0@0\0");
	}
}
/****************************************************************
**
**	Function: ExecuteProcess
**	Purpose:  运行进程
** 	Input Parammeters:
	          Object -- 需运行进程的命令行
	          ConnectSocket -- 连接句柄
**	Return:
**	datetime:
**
*****************************************************************/
void ExecuteProcess(const char *Object,int ConnectSocket)
{
	char Command[BUF_SIZE],Temp[BUF_SIZE];
	char *Param[BUF_SIZE];
	int j,i;
	char *pchTemp = 0;
	memset(Command, 0, sizeof(Command));
	memset(Temp, 0, sizeof(Temp));

	if (fork() == 0)
	{
		return;
	}

	if(ConnectSocket != 0)
	{
		close(ConnectSocket);
	}

	if (fork() != 0)
	{
		exit(0);
	}

	strcpy(Temp, Object);
	Trim(Temp);
	if('$' == Temp[0])
	{
		char szEnv[BUF_SIZE];
		memset(szEnv, 0, sizeof(szEnv));

		pchTemp = strchr(Temp, '/');
		memcpy(szEnv, Temp + 1, (pchTemp - 1) - (Temp + 1) + 1);
		strcpy(Command, getenv(szEnv));
		strcat(Command, pchTemp);
	}
	else
	{
		strcpy(Command,Object);
	}

	i=0;
	/*去掉最前面的空格*/
	while((Command[i])&&(isspace(Command[i])))
	{
		i++;
	}

	j = 0;
	for(j = 0;;j++)
	{
		while(isspace(Command[i]))
		{
			Command[i++] = '\0';
		}

		if (Command[i] == '\0')
		{
			break;
		}
		if(Command[i] == '"')
		{
			i++;
		}
		Param[j] = Command + i;
		if(Command[i-1] == '"')
		{
			i++;
			while((Command[i])&&(Command[i]!='"'))
			{
				i++;
			}
			Command[i++] = '\0';
		}
		while((Command[i])&&(isspace(Command[i]) == 0)&&(Command[i]!='"'))
		{
			i++;
		}

	}
	execvp(Command,Param);
	exit(1);
}
/****************************************************************
**
**	Function: StartProcess
**	Purpose:  启动对应进程
** 	Input Parammeters:
	          ProcessIndex -- 需运行进程的索引号
	          ConnectSocket -- 连接句柄
**	Return:
**	datetime:
**
*****************************************************************/
void StartProcess(int ProcessIndex, int ConnectSocket)
{
	C_Config Config;
	char CommandLine[STRING_LEN];
	char Command[STRING_LEN];
	char chTemp[STRING_LEN];
	char *pchTemp = 0;

	if(!ProcessExist(ProcessIndex))
	{
		/*获取进程执行命令行*/
		sprintf(Command, "CommandLine%d", ProcessIndex);
		if (Config.GetParam((char *)gv_chConfigFile,(char *)"AdmServer",Command,CommandLine) == false)
		{
			return;
		}
		Trim(CommandLine);
		if(pchTemp = strchr(CommandLine, ' '))
		{
			*pchTemp = '\0';
			pchTemp++;
			strcpy(chTemp, pchTemp);
			Trim(chTemp);
			if(pchTemp = strchr(chTemp, ' '))
			{
				*pchTemp = '\0';
				pchTemp++;
				Trim(pchTemp);
				sprintf(CommandLine, "%s %s %d %s", CommandLine, chTemp, ProcessIndex, pchTemp);
			}
			else
			{
				sprintf(CommandLine, "%s %s %d", CommandLine, chTemp, ProcessIndex);
			}
		}
		else
		{
			sprintf(CommandLine, "%s %d", CommandLine, ProcessIndex);
		}
		Trim(CommandLine);
		ExecuteProcess(CommandLine,ConnectSocket);
	}
}
/****************************************************************
**
**	Function: StopProcess
**	Purpose:  停止对应进程
** 	Input Parammeters:
	          ProcessIndex -- 需停止进程的索引号
**	Return:
**	datetime:
**
*****************************************************************/
void StopProcess(int ProcessIndex,int)
{
	S_ShareMemoryInformation ShareMemoryInformation;
	memset(&ShareMemoryInformation,0,sizeof(ShareMemoryInformation));
	if (ProcessExist(ProcessIndex) == true)
	{
		gv_ShareMemory.ReadShareMemory(ProcessIndex,&ShareMemoryInformation);
		if(atoi(ShareMemoryInformation.procid) != 0)
		{
			kill(atoi(ShareMemoryInformation.procid),SIGTERM);
		}
	}
	return;
}
/****************************************************************
**
**	Function: GetConfigString
**	Purpose:  得到配置文件中的参数
** 	Input Parammeters:
	          ConnectSocket -- socket连接句柄
**	Return:
**	datetime:
**
*****************************************************************/
void GetConfigString(int ConnectSocket)
{
	C_Config Config;
	C_BaseSock Socket;
	char FileName[STRING_LEN],Section[STRING_LEN],Key[STRING_LEN],Value[STRING_LEN],Result[STRING_LEN];

	if (Socket.ReadLine(ConnectSocket,FileName,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}

	if (Socket.ReadLine(ConnectSocket,Section,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}

	if (Socket.ReadLine(ConnectSocket,Key,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}
	if (Config.GetParam(FileName,Section,Key,Value) == false)
	{
		strcpy(Result,"Failure");
	}
	else
	{
		strcpy(Result,"Success");
	}

	if (Socket.WriteLine(ConnectSocket,Result,sizeof(Result)) <= 0)
	{
		close(ConnectSocket);
		return;
	}
	if (Socket.WriteLine(ConnectSocket,Value,sizeof(Value)) <= 0)
	{
		close(ConnectSocket);
	}
	return;
}
/****************************************************************
**
**	Function: SetConfigString
**	Purpose:  设置配置文件中的参数
** 	Input Parammeters:
	          ConnectSocket -- socket连接句柄
**	Return:
**	datetime:
**
*****************************************************************/
void SetConfigString(int ConnectSocket)
{
	C_Config Config;
	C_BaseSock Socket;
	char FileName[STRING_LEN],Section[STRING_LEN],Key[STRING_LEN],Value[STRING_LEN],Result[STRING_LEN];

	if(Socket.ReadLine(ConnectSocket,FileName,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}

	if(Socket.ReadLine(ConnectSocket,Section,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}

	if(Socket.ReadLine(ConnectSocket,Key,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}

	if(Socket.ReadLine(ConnectSocket,Value,STRING_LEN) <= 0)
	{
		close(ConnectSocket);
		return;
	}
	if(Socket.WriteLine(ConnectSocket,Result,sizeof(Result)) <= 0)
	{
		close(ConnectSocket);
		return;
	}
	return;
}

/****************************************************************
**
**	Function: ConnectionService
**	Purpose:  接收客户端传来的数据并作出相应的处理
** 	Input Parammeters:
	          ConnectSocket -- socket连接句柄
**	Return:
**	datetime:
**
*****************************************************************/
void ConnectionService(int ConnectSocket)
{
	C_BaseSock Socket;
	S_ShareMemoryInformation ShareMemoryInformation;
	memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));

	char RecvBuffer[BUF_SIZE],SendBuffer[BUF_SIZE],Object[BUF_SIZE];
	memset(RecvBuffer, 0, sizeof(RecvBuffer));
	memset(SendBuffer, 0, sizeof(SendBuffer));
	memset(Object, 0, sizeof(Object));
	char *Command,*Objects;
	int i,j,k;
	char chRecycleOrRedo[10],chMemoryIndex[5],*pchTemp;
	memset(chRecycleOrRedo, 0, sizeof(chRecycleOrRedo));
	memset(chMemoryIndex, 0, sizeof(chMemoryIndex));
	char chChannelCode[5];
	memset(chChannelCode, 0, sizeof(chChannelCode));
	char chCommand[BUF_SIZE];
	memset(chCommand, 0, sizeof(chCommand));

	for(;;)
	{
		i = Socket.ReadLine(ConnectSocket,RecvBuffer,sizeof(RecvBuffer));
		if (i <= 0)
		{
			if(ConnectSocket != -1)
			{
				close(ConnectSocket);
			}
			return;
		}
		if(strncmp(RecvBuffer,"Command",7)==0)
		{
			Trim(RecvBuffer);
			Command = strchr(RecvBuffer,'@') + 1;
			Trim(Command);
			Objects = strchr(Command,'@') + 1;
			Trim(Objects);
			if(strncmp(Command,"Configsrv@", 10) == 0)
			{
				//前台启动后台配置服务器
				strcpy(Object, "configsrv");
				strcpy(SendBuffer, "ConfigsrvStart");
				Socket.WriteLine(ConnectSocket, SendBuffer, sizeof(SendBuffer));
				ExecuteProcess(Object, ConnectSocket);
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if(strncmp(Command, "Dispense@", 9) == 0)
			{
				//前台启动数据分发
				char chStartDateTime[STRING_LEN];
				char chStartDate[10+1];
				char chStartTime[8+1];
				memset(chStartDate, 0, sizeof(chStartDate));
				memset(chStartTime, 0, sizeof(chStartTime));
				memset(chStartDateTime, 0, sizeof(chStartDateTime));

				pchTemp = strchr(Objects, ' ');
				pchTemp++;
				for(j = 0; *pchTemp != ' '; pchTemp++)
				{
					chChannelCode[j++] = *pchTemp;
				}
				Trim(chChannelCode);

				pchTemp++;
				for(j = 0; *pchTemp != '\0'; pchTemp++)
				{
					chMemoryIndex[j++] = *pchTemp;
				}
				Trim(chMemoryIndex);

				memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
				gv_ShareMemory.WriteShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
				pchTemp = strchr(Objects, '/');
				for(j = 0; *pchTemp != '\0'; pchTemp++)
				{
					chCommand[j++] = *pchTemp;
				}
				Trim(chCommand);
				ExecuteProcess(chCommand, ConnectSocket);

				//这个for循环用来判断程序是否启动成功
				for(;;)
				{
					gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
					memset(chStartDate, 0, sizeof(chStartDate));
					memset(chStartTime, 0, sizeof(chStartTime));
					memset(chStartDateTime, 0, sizeof(chStartDateTime));
					strcpy(chStartDateTime, ShareMemoryInformation.startdate);
					strcat(chStartDateTime, ShareMemoryInformation.starttime);
					if(strlen(chStartDateTime) != 0)
					{
						break;
					}
					sleep(1);
				}

				//这个for循环用来给前台不停地发送消息
				for(;;)
				{
					gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
					sprintf(SendBuffer,"%s@%s",ShareMemoryInformation.status,ShareMemoryInformation.object);
					Trim(SendBuffer);

					Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));

					if(strncmp(ShareMemoryInformation.status, IDLE, strlen(IDLE)) == 0)
					{
						kill(atoi(ShareMemoryInformation.procid), SIGTERM);
						break;
					}
					if(ShareMemoryInformation.procid == 0)
					{
						gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
						sprintf(SendBuffer,"%s@%s",ShareMemoryInformation.status,ShareMemoryInformation.object);
						Trim(SendBuffer);

						Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));

						break;
					}
					sleep(1);
				}
				Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if(strncmp(Command, "AccPrep@", 8) == 0)
			{
				//启动对帐预处理
				ExecuteProcess(Objects, ConnectSocket);
				Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if(strncmp(Command, "AccOrder@", 9) == 0)
			{
				//启动对帐排序
				ExecuteProcess(Objects, ConnectSocket);
				Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if(strncmp(Command, "AccCount@", 9) == 0)
			{
				//启动对帐
				ExecuteProcess(Objects, ConnectSocket);
				Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if(strncmp(Command, "AccIndb@", 8) == 0)
			{
printf("Command = %s\n", Command);
				//停止对帐入库
				char chChannelCode[3][10];
				char chMemoryIndex[3][10];

				pchTemp = Objects;

				for(j = 0; j < 3; j++)
				{
					k = 0;
					while(*pchTemp != ',')
					{
						chChannelCode[j][k] = *pchTemp;
						k++;
						pchTemp++;
					}
					Trim(chChannelCode[j]);
printf("chChannelCode[%d] = %s\n", j, chChannelCode[j]);
					k = 0;
					pchTemp++;
					while((*pchTemp != ';') && (*pchTemp != '\0'))
					{
						chMemoryIndex[j][k] = *pchTemp;
						k++;
						pchTemp++;
					}
					pchTemp++;
					Trim(chMemoryIndex[j]);
printf("chMemoryIndex[%d] = %s\n", j, chMemoryIndex[j]);
				}

				S_ShareMemoryInformation ShareMemoryInformation;
				for(i = 0; i < 3; i++)
				{
					for(;;)
					{
						memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
						gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex[i]), &ShareMemoryInformation);

printf("atoi(chMemoryIndex[%d]) = %d\n", i, atoi(chMemoryIndex[i]));
printf("ShareMemoryInformation.status = %s\n", ShareMemoryInformation.status);

						if(strncmp(ShareMemoryInformation.status, IDLE, strlen(IDLE)) == 0)
						{
printf("kill %d success!\n", atoi(ShareMemoryInformation.procid));
							kill(atoi(ShareMemoryInformation.procid), SIGTERM);
							break;
						}
						if(strncmp(ShareMemoryInformation.status, ERROR, strlen(ERROR)) == 0)
						{
							memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
							gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex[i]), &ShareMemoryInformation);

							strcpy(SendBuffer,"ERROR@");
							Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
							break;
						}
						sleep(1);
					}
				}
				strcpy(SendBuffer,"END@");
				Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
				close(ConnectSocket);
				ConnectSocket = -1;
			}
			else if((strncmp(Command, "ProcessStatus@", 14) == 0)
				||strncmp(Command, "HostStatus@", 11) ==0)
			{
				/*监控台发来的指令为请求进程状态或者是请求主机状态*/
				while (*Objects)
				{
					Objects = GetNextObject(Object,Objects);
					memset(SendBuffer, 0, sizeof(SendBuffer));
					GetShareMemInfo(SendBuffer,Object);
					Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
				}
				strcpy(SendBuffer,"DataFinished");
				Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
			}
			else if((strncmp(Command,"DiskStatus@",11)==0))
			{
				/*监控台发来的指令为请求磁盘状态*/
				while(*Objects)
				{
					Objects = GetNextObject(Object,Objects);
					GetDiskInfo(SendBuffer,Object);
					Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
				}
				strcpy(SendBuffer,"DataFinished");
				Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
			}
			else if(strncmp(Command,"Start@",6)==0)
			{
				/*启动进程*/
				while(*Objects)
				{
					Objects = GetNextObject(Object,Objects);
					StartProcess(atoi(Object),ConnectSocket);
				}
			}
			else if(strncmp(Command,"Stop@",5)==0)
			{
				/*停止进程*/
				while(*Objects)
				{
					Objects = GetNextObject(Object,Objects);
					StopProcess(atoi(Object),ConnectSocket);
				}
			}
			else if(strncmp(Command, "Reset@",6) == 0)
			{
				/*重启当前系统的所有正在运行的进程*/
				ResetAllProcess();
				Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
			}
			else if((strncmp(Command,"Execute@",8)==0))
			{
				/*执行命令*/
				while(*Objects)
				{
					Objects = GetNextObject(Object,Objects);
					ExecuteProcess(Object,ConnectSocket);
				}
			}
			else if((strncmp(Command, "Outdb@", 6)==0))
			{
cout<<"Command = "<<Command<<endl;
cout<<"Objects = "<<Objects<<endl;

⌨️ 快捷键说明

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