📄 runserver.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 + -