www.pudn.com > 代理服务器原代码.rar > Service.cpp


//******************************************************************* 
//               
//  FILE:       Service.cpp 
//               
//  AUTHOR:     sam sha 
//               
//  PROJECT:    mproxysvr3 
//               
//  COMPONENT:  CService 
//               
//  DATE:       23.06.2003 
//               
//  COMMENTS:   - 服务程序模型来源于codeproject上的一个wizard模型,稍有扩充 
//                 
//               
//******************************************************************* 
 
 
 
 
 
// Includes 
// Service.cpp: implementation of the CService class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include  
#include "Service.h" 
#include "mproxy3.h" 
 
CService _Module; 
 
//两个二级代理的服务端口 
CMProxy3 _ProxyHttp(18800,"10.20.188.16",80); 
CMProxy3 _ProxySocket(18801,"10.20.188.16",1080); 
//本软件仅支持直接的http代理 
//CMProxy3 _ProxyHttpDirect(801); 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CService::CService() 
{ 
	int nErr; 
	WSADATA WsaData; 
	nErr = WSAStartup (0x0202, &WsaData); 
	if (nErr == SOCKET_ERROR) 
	{ 
		//printf( "WSAStartup Failed\n"); 
		return; 
	} 
	 
 
} 
 
CService::~CService() 
{ 
	WSACleanup(); 
} 
 
void CService::Init(LPCTSTR pServiceName,LPCTSTR pServiceDisplayedName) 
{ 
    lstrcpy(m_szServiceName,pServiceName); 
    lstrcpy(m_szServiceDisplayedName,pServiceDisplayedName); 
 
    // set up the initial service status  
    m_hServiceStatus = NULL; 
    m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
    m_status.dwCurrentState = SERVICE_STOPPED; 
    m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP/* | SERVICE_ACCEPT_PAUSE_CONTINUE*/; 
    m_status.dwWin32ExitCode = 0; 
    m_status.dwServiceSpecificExitCode = 0; 
    m_status.dwCheckPoint = 0; 
    m_status.dwWaitHint = 0; 
} 
 
void CService::Start() 
{ 
    SERVICE_TABLE_ENTRY st[] = 
    { 
		{ m_szServiceName, _ServiceMain }, 
        { NULL, NULL } 
    }; 
    if (!::StartServiceCtrlDispatcher(st) && m_bService) 
	{ 
		DWORD dw = GetLastError(); 
		LogEvent("StartServiceCtrlDispatcher Error=%d",dw); 
		m_bService = FALSE; 
	} 
 
    if (m_bService == FALSE) 
        Run(); 
} 
 
void CService::ServiceMain() 
{ 
    // Register the control request handler 
    m_status.dwCurrentState = SERVICE_START_PENDING; 
    m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler); 
    if (m_hServiceStatus == NULL) 
    { 
        LogEvent("Handler not installed"); 
        return; 
    } 
    SetServiceStatus(SERVICE_START_PENDING); 
 
    m_status.dwWin32ExitCode = S_OK; 
    m_status.dwCheckPoint = 0; 
    m_status.dwWaitHint = 0; 
 
    // When the Run function returns, the service has stopped. 
    Run(); 
 
    SetServiceStatus(SERVICE_STOPPED); 
    LogEvent("Service stopped"); 
} 
 
inline void CService::Handler(DWORD dwOpcode) 
{ 
    switch (dwOpcode) 
    { 
    case SERVICE_CONTROL_STOP: 
		LogEvent("Request to stop..."); 
		SetServiceStatus(SERVICE_STOP_PENDING); 
	    //PostThreadMessage(m_dwThreadID, WM_QUIT, 0, 0); 
        break; 
    case SERVICE_CONTROL_PAUSE: 
	//	LogEvent("Request to pause..."); 
	//	SetServiceStatus(SERVICE_PAUSE_PENDING); 
        break; 
    case SERVICE_CONTROL_CONTINUE: 
	//	LogEvent("Request to continue..."); 
	//	SetServiceStatus(SERVICE_CONTINUE_PENDING); 
       break; 
    case SERVICE_CONTROL_INTERROGATE: 
        break; 
    case SERVICE_CONTROL_SHUTDOWN: 
        break; 
    default: 
        LogEvent("Bad service request"); 
		break; 
    } 
} 
 
void WINAPI CService::_ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) 
{ 
    _Module.ServiceMain(); 
} 
void WINAPI CService::_Handler(DWORD dwOpcode) 
{ 
    _Module.Handler(dwOpcode);  
} 
 
void CService::SetServiceStatus(DWORD dwState) 
{ 
    m_status.dwCurrentState = dwState; 
    ::SetServiceStatus(m_hServiceStatus, &m_status); 
} 
 
DWORD CService::GetServiceStatus() 
{ 
	return m_status.dwCurrentState; 
} 
//******************************************************************* 
//               
//  FUNCTION:   - Run() 
//               
//  RETURNS:    - 
//               
//  PARAMETERS: - 
//               
//  COMMENTS:   - 当服务启动后,调用Run(),Run()结束后服务停止 
//               
//               
//******************************************************************* 
 
void CService::Run() 
{ 
    LogEvent("Service started"); 
	m_dwThreadID = GetCurrentThreadId(); 
 
    if (m_bService) 
        SetServiceStatus(SERVICE_RUNNING); 
 
	//启动服务 
	_ProxyHttp.Start(); 
	//_ProxyFtp.Start(); 
	_ProxySocket.Start(); 
 
 
	//判断服务停止 
	while (m_status.dwCurrentState == SERVICE_RUNNING ) 
	{ 
		Sleep(3000); 
		if ( m_status.dwCurrentState == SERVICE_STOP_PENDING ) 
			break; 
	} 
	//停止服务 
	_ProxyHttp.Stop(); 
	//_ProxyFtp.Stop(); 
	_ProxySocket.Stop(); 
 
 
 
} 
 
BOOL CService::Install() 
{ 
    if (IsInstalled()) 
        return TRUE; 
 
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 
    if (hSCM == NULL) 
    { 
        MessageBox(NULL, "Couldn't open service manager", m_szServiceName, MB_OK); 
        return FALSE; 
    } 
 
    // Get the executable file path 
    TCHAR szFilePath[_MAX_PATH]; 
    ::GetModuleFileName(NULL, szFilePath, _MAX_PATH); 
 
    SC_HANDLE hService = ::CreateService( 
        hSCM, m_szServiceName, m_szServiceDisplayedName, 
        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, 
        SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, 
        szFilePath, NULL, NULL, NULL, NULL, NULL); 
 
    if (hService == NULL) 
    { 
        ::CloseServiceHandle(hSCM); 
        MessageBox(NULL, "Couldn't create service", m_szServiceName, MB_OK); 
        return FALSE; 
    } 
 
    ::CloseServiceHandle(hService); 
    ::CloseServiceHandle(hSCM); 
    return TRUE; 
} 
 
BOOL CService::Uninstall() 
{ 
    if (!IsInstalled()) 
        return TRUE; 
 
	 
 
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 
 
    if (hSCM == NULL) 
    { 
        MessageBox(NULL, "Couldn't open service manager", m_szServiceName, MB_OK); 
        return FALSE; 
    } 
 
    SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_STOP | DELETE); 
 
    if (hService == NULL) 
    { 
        ::CloseServiceHandle(hSCM); 
        MessageBox(NULL, "Couldn't open service", m_szServiceName, MB_OK); 
        return FALSE; 
    } 
    SERVICE_STATUS status; 
    ::ControlService(hService, SERVICE_CONTROL_STOP, &status); 
 
    BOOL bDelete = ::DeleteService(hService); 
    ::CloseServiceHandle(hService); 
    ::CloseServiceHandle(hSCM); 
 
    if (bDelete) 
        return TRUE; 
 
    MessageBox(NULL, "Service could not be deleted", m_szServiceName, MB_OK); 
    return FALSE; 
} 
 
BOOL CService::IsInstalled() 
{ 
    BOOL bResult = FALSE; 
 
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 
 
    if (hSCM != NULL) 
    { 
        SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_QUERY_CONFIG); 
        if (hService != NULL) 
        { 
            bResult = TRUE; 
            ::CloseServiceHandle(hService); 
        } 
        ::CloseServiceHandle(hSCM); 
    } 
    return bResult; 
} 
 
/////////////////////////////////////////////////////////////////////////////////////// 
// Logging functions 
void CService::LogEvent(LPCSTR pFormat, ...) 
{ 
    TCHAR    chMsg[256]; 
    HANDLE  hEventSource; 
    LPTSTR  lpszStrings[1]; 
    va_list pArg; 
 
    va_start(pArg, pFormat); 
    vsprintf(chMsg, pFormat, pArg); 
    va_end(pArg); 
 
    lpszStrings[0] = chMsg; 
 
    if (m_bService) 
    { 
        /* Get a handle to use with ReportEvent(). */ 
        hEventSource = RegisterEventSource(NULL, m_szServiceName); 
        if (hEventSource != NULL) 
        { 
            /* Write to event log. */ 
            ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL); 
            DeregisterEventSource(hEventSource); 
        } 
    } 
    else 
    { 
        // As we are not running as a service, just write the error to the console. 
        printf(chMsg); 
    } 
}