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

📄 main.c

📁 由于linux作服务器运行时,时常会出现系统时间不正确现象,现提供完整的时间服务器和客户端程序,由window提供时间服务器端供多台Linux服务器获取window上时间并做出时间调整.
💻 C
字号:

#include "main.h"

/****************************************************************************************/
#define SERVICENAME                     "TimeServer"
#define SHOWNAME                        "TimeServer"

/****************************************************************************************/
volatile BOOL         g_isStop;
SERVICE_STATUS_HANDLE g_hServiceStatus;
SERVICE_STATUS        g_ServiceStatus;

/****************************************************************************************/
VOID WINAPI TimeServerNotifyProc( DWORD dwControl )
{
  switch ( dwControl )
  {
  case SERVICE_CONTROL_STOP:
  case SERVICE_CONTROL_SHUTDOWN:
    g_isStop = TRUE;
    break;
  default:
    SetServiceStatus( g_hServiceStatus, &g_ServiceStatus);
    break;
  }
}
/****************************************************************************************/
VOID WINAPI MainThread( DWORD dwArgc, LPTSTR *lpszArgv )
{
//	HANDLE          hSyncThread;
//	DWORD           dwThreadID;

	UpdateLogFile( "Enter MainThread" );
//#ifndef _DEBUG
	g_hServiceStatus = RegisterServiceCtrlHandler( SERVICENAME, TimeServerNotifyProc );
  
	if( !g_hServiceStatus ) 
		return;
  
	memset( &g_ServiceStatus , 0 , sizeof( g_ServiceStatus ) );

	g_ServiceStatus.dwServiceType      = SERVICE_WIN32_OWN_PROCESS;
	g_ServiceStatus.dwCurrentState     = SERVICE_RUNNING;
	g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
	g_ServiceStatus.dwWin32ExitCode    = NO_ERROR;

	SetServiceStatus( g_hServiceStatus , &g_ServiceStatus );
  
//#endif

	//下面是工作的主体

	if( InitServer( ) )
	{
    	g_isStop = FALSE;
		while( !g_isStop && ServerHandler( ) );
	}
	ReleaseServer ();

//#ifndef _DEBUG
	g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
	SetServiceStatus( g_hServiceStatus , &g_ServiceStatus );
//#endif
	UpdateLogFile( "Exit MainThread" );
}
/****************************************************************************************/

/****************************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
	const SERVICE_TABLE_ENTRY aServiceEntries[] =
	{
		{ SERVICENAME, MainThread },
		{ NULL,        NULL       }
	};
	SC_HANDLE       hSCManager;
	SC_HANDLE       hService;
	SERVICE_STATUS  ServiceStatus;

	TCHAR           aszBinaryPathName[MAX_PATH];
	OSVERSIONINFO   VerInfo;


	VerInfo.dwOSVersionInfoSize = sizeof VerInfo;
	GetVersionEx (&VerInfo);
	if (VerInfo.dwMajorVersion <= 4)
	{
		MessageBox (NULL, "错误的Windows版本,此程序只能在Windows 2000或Windows XP中运行!",
				"STOP", MB_OK|MB_ICONSTOP);
		return 0;
	}

	GetVersionEx ((OSVERSIONINFO*)&VerInfo);

	if (stricmp (lpCmdLine, "install") == 0)
	{
		hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
		if (hSCManager)
		{
			GetModuleFileName (hInstance, aszBinaryPathName, sizeof aszBinaryPathName);

			strcat (aszBinaryPathName, " daemon");
			hService = CreateService (hSCManager, SERVICENAME, SHOWNAME,
									SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
									SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
									aszBinaryPathName, NULL, NULL, NULL, NULL, NULL);

			if (hService)
			{
				MessageBox (NULL, "Create service successful!", "TimeServer",
					MB_OK|MB_ICONINFORMATION);
				
				//if (StartService (hService, 0, NULL))
					//MessageBox (NULL, "Start service successful!", "TimeServer",
						//MB_OK|MB_ICONINFORMATION);
				
				CloseServiceHandle (hService);
			}
			CloseServiceHandle (hSCManager);
		}
	}
	else if (stricmp (lpCmdLine, "uninstall") == 0)
	{
		hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
		if (hSCManager)
		{
			hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
			if (hService)
			{
				if (DeleteService (hService))
					MessageBox (NULL, "Delete service successful!", "TimeServer",
						MB_OK|MB_ICONINFORMATION);
				CloseServiceHandle (hService);
			}
			CloseServiceHandle (hSCManager);
		}
	}
	else if (stricmp (lpCmdLine, "start") == 0)
	{
		hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
		if (hSCManager)
		{
			hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
			if (hService)
			{
				if (StartService( hService , 0, NULL))
					MessageBox (NULL, "Start service successful!", "TimeServer",
						MB_OK|MB_ICONINFORMATION);
				CloseServiceHandle (hService);
			}
			CloseServiceHandle (hSCManager);
		}
	}
	else if (stricmp (lpCmdLine, "stop") == 0)
	{
		hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
		if (hSCManager)
		{
			hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
			if (hService)
			{
				if (ControlService (hService, SERVICE_CONTROL_STOP, &ServiceStatus))
					MessageBox (NULL, "Stop service successful!", "TimeServer",
						MB_OK|MB_ICONINFORMATION);
				CloseServiceHandle (hService);
			}
			CloseServiceHandle (hSCManager);
		}
	}
	else if (stricmp (lpCmdLine, "daemon") == 0)
		StartServiceCtrlDispatcher (aServiceEntries);
	else
		MessageBox (NULL, "这是一个服务程序,请控制面板中启动!", "STOP", MB_OK|MB_ICONSTOP);
	return 0;

}
/****************************************************************************************/

⌨️ 快捷键说明

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