Example #1
0
void CP2PServiceModule::RunMessageLoop()   
{    
#if defined(_DEBUG)
	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
	CKLog::SetDebugType( LOG_TYPE_DEBUG);
#else
	CKLog::SetDebugType( LOG_TYPE_WARNING);
#endif

	char szServiceName[256];
	::LoadString( NULL, IDS_SERVICENAME, szServiceName, sizeof(szServiceName));
	ChangeServiceStartType( szServiceName, SERVICE_AUTO_START);

	TCHAR szClient_Mutex[] = _T("PPVOD_MUTEX_K_1.0");
	if ( ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, szClient_Mutex) ) return;
	::CreateMutex(0, FALSE, szClient_Mutex);

	g_socketClientMgr.Connect();

	bool bListen = false;
	UINT uPort = 81;

	for ( int i = 1; i < 20; i ++ )
	{
		g_server.setPort( uPort);
		if ( g_server.create( string("P2PLocalService"), string("C:\\") ) )
		{
			bListen = true;
			break;
		}
		uPort += i;
	}

	HttpResponse::setServer( g_server );

	if ( bListen )
	{
		// 设置共享内存监听端口为 uPort
		CRegKey reg;
		LPCTSTR lpszKey = "SOFTWARE\\P2PService_K";

		if ( reg.Open( HKEY_LOCAL_MACHINE, lpszKey ) == ERROR_SUCCESS )
		{
			TCHAR szAppPath[MAX_PATH];
			ULONG ulLen = sizeof( szAppPath );
			if ( reg.SetDWORDValue( "ListenPort", uPort ) == ERROR_SUCCESS )
			{
			}
			reg.Close();
		}

		SetTimer( NULL, CHECK_SERVER_TIMER, 1000, NULL);

		MSG msg;
		while( GetMessage(&msg, NULL, 0, 0 )) 
		{
			switch( msg.message) {
			case WM_TIMER:
				OnCheckTimer( 0, 0);
				break;
			default:
				break;
			}
			TranslateMessage(&msg); 
			DispatchMessage(&msg); 
		}

		KillTimer( NULL, CHECK_SERVER_TIMER);
	}

	g_server.stop();

	SetServiceStatus(SERVICE_STOPPED);
}