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

📄 runserver.cpp

📁 跨操作系统的微型中间件
💻 CPP
字号:
#include "RunServer.h"

#include <stdio.h>
#include <signal.h>

#include "MyVersion.h"#include "OSThread.h"
#include "OS.h"
#include "OSMacro.h"
#include "Socket.h"
#include "SocketUtils.h"
#include "PortManager.h"
#include "OSTimer.h"
#include "LogInterface.h"
#include "XMLConfig2.h"

#include "NetworkStat.h"

#if LICENSE_VERSION
#include "LicenseExport.h" 
#include "NatRequestMng.h"
	#ifdef WIN32
		#pragma comment(lib,"../../lib/License.lib")
	#endif
#endif   

#ifdef __linux__
 #include <sys/resource.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
#endif

Bool g_LockServer = TRUE;

Bool InitThreadPool();

void EchoVersion();

void SigFunc(int v_sig);

#ifdef __P2P__
Bool isQuit;  //用来标识是否已经退出, 方便p2p端调用退出函数后,明确知道已经退出
#endif

Bool bQuit = FALSE;

int RunServer(const char *pConfig)
{
#if LICENSE_VERSION
#pragma message("link license...")
	License::Init( (void*)(&CNatRequestMng::GetLocalMacAddr) );
	if ( License::VerifyCertificate( "./license.cer" ) != 0 )
	{
		ERR_LOGGER2( "Data of certificate is invalid." );
		return -1;
	}
	RUN_LOGGER2( "Verify the certificate success." );
#endif

	bQuit = FALSE;

#ifdef __P2P__
	isQuit = FALSE;
#endif
	
	int iRet = 0;
	iRet = InitializeServer(pConfig, TRUE);
	if(iRet != 0 )
		return iRet;
			
	//wait for signal	
	while(!bQuit) OS::Sleep(1000);

	iRet = DestroyServer();
	return iRet;
}

Bool bEnableRTSP = FALSE;
int InitializeServer(const char *pConfig, bool vEnableRTSP)
{
	g_LockServer = TRUE;

    bEnableRTSP = vEnableRTSP;

#ifdef __linux__
    //grow our pool of file descriptors to the max!
    struct rlimit rl;
    // set it to the absolute maximum that the operating system allows - have to be superuser to do this
    rl.rlim_cur = 8192;
    rl.rlim_max = 8192;
    setrlimit(RLIMIT_NOFILE, &rl);



	signal(SIGTERM,SigFunc);	//终止信号
	signal(SIGUSR1,SigFunc);
	signal(SIGUSR2,SigFunc);

	//忽略的信号
	/* ignore terminal I/O, stop signals */
	signal(SIGTTOU,SIG_IGN);
	signal(SIGTTIN,SIG_IGN);
	//signal(SIGTSTP,SIG_IGN);

	signal(SIGPIPE,SIG_IGN);	//管道出错
	//signal(SIGCHLD,SIG_IGN);	//child发送终止信号给parent, 多进程时不能忽略,否则父进程的wait会失败

	//set env
	if(setenv("LD_LIBRARY_PATH","../../lib:$LD_LIBRARY_PATH",1) != 0) {
		printf("Set env failed\n");
		return -1;
	}
#endif

	

	//安装CTRL+C捕捉器
	signal(SIGINT,SigFunc);

	EchoVersion();

	//initialize
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize CurUsedBindwidthCalc ......\n");
#endif
	printf("Initialize CurUsedBindwidthCalc ......\t\t\t\t");
	g_pRstpBindwidthCalc = new CCurUsedBindwidthCalc;
	if(g_pRstpBindwidthCalc == NULL){
		printf("failed\n");
		return -1;
	}
	g_pRstpBindwidthCalc->SetCalcWindow(1);
	printf("done\n");

	//0 Init Config File
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize Configuration ......\n");
#endif
	printf("Initialize Configuration ......\t\t\t\t");
	if( CXMLConfigMng::GetInst(pConfig)->ReadDataFromFile() )
	{
		printf("done\n");
	}
	else
	{
		////////////
		printf("Failed\n");
		return -1;
	}

	//Init OS
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize OS module ......\n");
#endif
	OS::Initialize();

	//初始化socket系统
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize Socket System ......\n");
#endif
	printf("Initialize Socket System ......\t\t\t\t");
	Socket::Initialize();
	SocketUtils::Initialize();
	printf("done\n");
	
	//初始化PortManager
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize PortManager ......\n");
#endif
	printf("Initialize PortManager ......\t\t\t\t");
	PortManager::GetInstance()->Initialize();
	printf("done\n");

	//初始化线程池
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize OSThreadPool ......\n");
#endif
	if (InitThreadPool() == FALSE)
	{
		printf("\t\t\t\tfalied\n");
		return -1;
	}
	
	//初始化OSTimer
#ifdef WIN32
	OutputDebugString("-- Armer -- Initialize OSTimerTask ......\n");
#endif
	printf("Initialize OSTimerTask ......\t\t\t\t");
	OSTimerTask::GetInstance()->Initialize();
	printf("done\n");

#ifdef WIN32
	OutputDebugString("Startup Successfully!\n");
#endif
	printf("Startup Successfully!\n");

	g_LockServer = FALSE;
	return 0;
}

int DestroyServer()
{
	g_LockServer = TRUE;
	printf("Start to destroy ...\n");

#ifdef WIN32
	OutputDebugString("-- Armer -- Delete OSTimerTask ......\n");
#endif
	//析构OSTimer
	printf("Delete OSTimerTask ......");
	OSTimerTask::GetInstance()->DelInstance();
	printf("\t\t\t\tDone\n");
	
#ifdef WIN32
	OutputDebugString("-- Armer -- Delete OSThreadPool ......\n");
#endif
	//删除线程池
	printf("Delete OSThreadPool ......");
	if (g_ThreadPool->DestroyInstance() == FALSE)
		printf("\t\t\t\tfailed\n");
	else
		printf("\t\t\t\tdone\n");

#ifdef WIN32
	OutputDebugString("-- Armer -- Delete PortManager ......\n");
#endif
	//销毁PortManager实例
	printf("Delete PortManager ......");
	PortManager::DelInstance();
	printf("\t\t\t\tdone\n");
	
#ifdef WIN32
	OutputDebugString("-- Armer -- Delete CurUsedBindwidthCalc ......\n");
#endif
	printf("Delete CurUsedBindwidthCalc ......\t\t\t\t");
	delete g_pRstpBindwidthCalc;
	g_pRstpBindwidthCalc = NULL;
	printf("\t\t\tdone\n");

#ifdef WIN32
	OutputDebugString("-- Armer -- Delete config.xml ......\n");
#endif
	//0 Del Config
	printf("Delete Config.xml.............\t\t\t");
	if(CXMLConfigMng::DelInst())
	{
		printf("Done\n");
	}
	else
	{
		printf("Failed\n");		
	}

#ifdef WIN32
	OutputDebugString("-- Armer -- Shutdown Socket System ......\n");
#endif
	//关闭Socket系统
	printf("Shutdown Socket System ......");
	SocketUtils::Uninitialize();
	Socket::Uninitialize();
	printf("\t\t\t\tdone\n");

#ifdef WIN32
	OutputDebugString("-- Armer -- Done ......\n");
#endif
	
#ifdef __P2P__
	isQuit = TRUE; //用来标识是否已经退出, 方便p2p端调用退出函数后,明确知道已经退出
#endif
	
	return 0;
}

//处理CTRL + C信号
void SigFunc(int v_sig)
{
	bQuit=TRUE;
}


//初始化线程池
Bool InitThreadPool()
{
	printf("Initialize OSThreadPool ......");
	if ((g_ThreadPool = OSThreadPool::GetInstance()) == NULL)
		return FALSE;
	Int32 i_ThreadNum = SConfigPara::m_ThreadNum;

	if (i_ThreadNum <= 0)
		return FALSE;
	Int32 i_StackSize = SConfigPara::m_StackSize;

	if (i_StackSize <= 0)
		return FALSE;
	if (g_ThreadPool->Initialize(i_ThreadNum,i_StackSize) == FALSE)
		return FALSE;
	printf("\t\t\t\tdone\n");
	return TRUE;
}

void EchoVersion()
{
	printf( "************************************************************\n"
		"%s\n"
		"Version: %s\n"
		"Build  : %s %s\n"
		"************************************************************\n",
		MY_ROLE,
		MY_VERSION,
		__DATE__,__TIME__
		);
}

⌨️ 快捷键说明

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