📄 main.cpp
字号:
//Ufc library header.
#include "minifc.h"
#include "main.h"
#include "mgrbaseclient.h"
#include "config.h"
#include "dlif.h"
extern "C"{
int g_SysArgc ;
char **g_SysArgv ;
BOOL g_bRestart=FALSE;
}
#ifndef __windows__
int main(int argc, char *argv[])
{
do{
g_bRestart = FALSE ;
dlsrv_main( argc, argv);
}while( g_bRestart) ;
#ifdef _DEBUG
return 0 ;
#else
exit( 0);
#endif
}
#endif
char product_info[] = "SURE HAMMER DOWNLOAD SERVER 1.0";
//svr addr
CString svr_addr;
CString svr_port;
int imaxclnt;
//mgrbase
CString mgrbase_addr;
long mgrbase_port;
CString mgrbase_dbname;
long mgrbase_maxconn;
//long g_expire_days;
//int g_timeout;
//int g_maxidle;
//dc
CString dc_addr;
long dc_port;
long dc_maxconn;
//monitor server
CMonitorServer *g_mon=NULL;
CString mon_port;
//log support
CString g_logdir;
CString g_workdir;
//log and monitor thread
THREAD_RETTYPE WINAPI th_Monitor( JThread *th_mon);
THREAD_RETTYPE WINAPI th_Log( JThread *th_log);
THREAD_RETTYPE WINAPI th_debug(JThread *th );
//configuration file name.
CString profile=DEFAULT_PROFILE;
//servers
extern struct srpc_if dlif[];
SRPCSocketSvr *g_svr=NULL;
//configs
DLConfig *g_config=NULL;
int dlsrv_main( int argc, char *argv[])
{
#ifdef __windows__
char fpath[250];
CString path, dir;
GetModuleFileName(GetModuleHandle(NULL),fpath,250);
path=fpath;
getfiledir(path,&dir);
SetCurrentDirectory(dir);
#endif
#ifdef _DEBUG
ucpplib_set_unexpected();
#endif
#ifndef WIN32
signal(SIGPIPE,SIG_IGN);
#endif
//Initialize the monitor server
g_mon=new CMonitorServer(200);
g_mon->m_cs.Lock(DEBUGMTPARAM);
g_mon->m_welcome.Empty();
g_mon->m_welcome+=product_info;
g_mon->m_welcome+="\r\n";
g_mon->m_cs.Unlock();
//Initialize profile
if(argc<2)
profile=DEFAULT_PROFILE;
else
{
if(!strcmp(argv[1],"-debug")||!strcmp(argv[1],"-console"))
{
if(argc==2) profile=DEFAULT_PROFILE;
else profile=argv[2];
}
else
profile=argv[1];
}
JProfile pf(profile);
JThread th_mon, th_log;
//int ntryconnect,i;
//pf.ReadStr( "dlsrv.server.addr", svr_addr,""); svr_addr.Trim();
//if(svr_addr.GetLength()==0)
svr_addr="0.0.0.0";
pf.ReadStr( "dlsrv.server.port", svr_port, DEFAULT_SERVERPORT); svr_port.Trim();
pf.ReadStr( "dlsrv.mon.port", mon_port, DEFAULT_MONITORPORT); mon_port.Trim();
imaxclnt=(int)pf.ReadNumber("dlsrv.maxconnect",0);
if( imaxclnt==0) imaxclnt=50000;
pf.ReadStr( "dlsrv.server.logdir", g_logdir, ""); g_logdir.Trim();
pf.ReadStr( "dlsrv.server.workdir", g_workdir, TEMP_DIRECTORY); g_workdir.Trim();
pf.ReadStr( "mgrbase.addr", mgrbase_addr, "127.0.0.1");
mgrbase_port=(long)pf.ReadNumber("mgrbase.port",DEFAULT_MGRBASE_PORT);
pf.ReadStr( "mgrbase.dbname", mgrbase_dbname, ""); mgrbase_dbname.Trim();
mgrbase_maxconn=(long)pf.ReadNumber("mgrbase.maxconn",DEFAULT_MGRBASE_MAXCONN);
pf.ReadStr( "dc.addr", dc_addr, "127.0.0.1");
dc_port=(long)pf.ReadNumber("dc.port",DEFAULT_DC_PORT);
dc_maxconn=(long)pf.ReadNumber("dc.maxconn",DEFAULT_DC_MAXCONN);
//g_expire_days=(long)pf.ReadNumber("dlsrv.mgrbase.expiredays",DEFAULT_EXPIRE_DAYS);
//g_timeout=(int)pf.ReadNumber("dlsrv.timeout", DEFAULT_SERVER_TIMEOUT);
//g_maxidle=(int)pf.ReadNumber("dlsrv.maxidle", 0);
printf("\n%s\n", product_info);
//start monitor server.
th_mon.Start((THREADFUN)th_Monitor);
//if log is on, start the log thread.
if( g_logdir.GetLength())
th_log.Start((THREADFUN)th_Log);
//DO YOUR THINGS HERE!--->
//init DLConfig
g_config=new DLConfig;
if( !g_config->init_db(mgrbase_addr,mgrbase_port,mgrbase_dbname,mgrbase_maxconn))
{
g_mon->printf("init db '%s' FAILURE!\r\n",(LPCSTR)mgrbase_dbname);
exit( 1);
}
if( !g_config->init_dc(dc_addr,dc_port,dc_maxconn))
{
g_mon->printf("init dc %s,%u FAILURE!\r\n",(LPCSTR)dc_addr,dc_port);
exit( 2);
}
if( !g_config->init(profile))
{
g_mon->printf("init FAILURE!\r\n");
exit( 3);
}
//for(i=0;i<ntryconnect;i++)
//{
// if(g_svr->init_smci(dlsrv_smci_addr,dlsrv_smci_port,MAXDCCONNECT))
// break;
// printf("Connect to DATA CENTER failed!\n");
// g_mon->printf("Connect to DATA CENTER failed!\r\n");
// JThread::Sleep(5000);
//}
//if(i==ntryconnect)
// return 0;
#ifdef _DEBUG
JThread debug_th;
//debug_th.m_userdata=(superint_ut)this;
debug_th.Start((THREADFUN)th_debug);
#endif
//启动下载管理线程
JThread th_mgr;
th_mgr.Start((THREADFUN)th_dlmgr);
g_mon->printf("DOWNLOAD SERVER listen addr:%s \r\n",(LPCSTR)svr_addr);
g_mon->printf("\r\n");
g_svr=new SRPCSocketSvr(dlif);
g_mon->printf("start DOWNLOAD SERVER on: %s\r\n",(LPCSTR)svr_port);
if( !g_svr->StartFix(svr_addr,svr_port,5,100,imaxclnt))
{
g_mon->printf("DOWNLOAD SERVER start FAILURE!\r\n");
}
g_mon->printf("wait for DOWNLOAD SERVER safe closed ...\r\n");
g_svr->Close();
g_svr->WaitForSafeShutdown();
//关闭下载管理线程
th_mgr.Shutdown();
th_mgr.WaitForSafeClose();
#ifdef _DEBUG
debug_th.Shutdown();
debug_th.WaitForSafeClose();
#endif
delete g_svr;
g_svr=NULL;
//DO YOUR THINGS HERE!<---
//shutdown the log thread.
if( g_logdir.GetLength())
{
//g_mon->printf("Log Stopping......\r\n");
JThread::Sleep(100);
th_log.Shutdown();
th_log.WaitForSafeClose();
}
//shutdown the monitor server.
//g_mon->printf("Monitor Shutdown......\r\n");
g_mon->Shutdown();
g_mon->WaitForSafeShutdown();
//shutdown the monitor server thread.
th_mon.WaitForSafeClose();
delete g_mon;
delete g_config;
printf( "DOWNLOAD SERVER safe closed\n\n\n");
return 0;
}
void dlsrv_shutdown( void)
{
if( g_svr && !g_svr->IsShutdown())
g_svr->Shutdown();
return;
}
THREAD_RETTYPE WINAPI th_Monitor( JThread *th_mon)
{
//printf("monitor port:%s\n",(LPCSTR)mon_port);
g_mon->printf("DOWNLOAD SERVER monitor port: %s\r\n",(LPCSTR)mon_port);
g_mon->StartFix( svr_addr, mon_port);
JTHREAD_EXIT( 0);
}
CStdioFile *lpfile=NULL;
CString cur_logfile="";
void WriteLog(LPCSTR dir,LPCSTR info)
{
CStdioFile *lpf;
CString path;
CString dt_str;
CString timestamp;
datetime_t dt=nowtime();
dt_str.Format( "dlsrv%02d%02d.log", getmonth(dt), getday(dt));
if (!(lpfile && dt_str==cur_logfile))
{
if( lpfile)
{
(*lpfile).Close();
delete lpfile;
lpfile = NULL;
}
mergepath(path, dir, dt_str);
lpf = new CStdioFile();
if( !(*lpf).Open( path, CFile::modeReadWrite|CFile::shareDenyWrite))
{
if( !(*lpf).Open( path, CFile::shareDenyWrite|CFile::modeReadWrite|CFile::modeCreate))
{
delete lpf;
return;
}
}
lpfile=lpf;
cur_logfile=dt_str;
}
(*lpfile).SeekToEnd();
timestamp.Format("[%02d:%02d:%02d] ", gethour(dt), getminute(dt), getsecond(dt));
(*lpfile).WriteString(timestamp);
(*lpfile).WriteString(info);
(*lpfile).Flush();
}
BOOL ReadInfo(JThread *th_log, StdSocket *p,CString &info)
{
char prech,ch=0;
info.Empty();
while(TRUE)
{
while(!p->TestReceive(1,0))
{
if(th_log->IsShutdown())
return FALSE;
}
prech=ch;
ch=p->GetCh();
if(ch==0)
return FALSE;
info+=ch;
if(prech=='\r' && ch=='\n')
return TRUE;
}
return TRUE;
}
THREAD_RETTYPE WINAPI th_Log( JThread *th_log)
{
StdSocket *sock=NULL;
CString info;
datetime_t dt=nowtime();
CString mon_addr;
char *mon[12]={"JAN" , "FEB" , "MAR" , "APR" , "MAY" , "JUN" ,
"JUL" , "AUG" , "SEP" , "OCT" , "NOV" , "DEC"};
info.Format("\r\n%s %02d %4d %02d:%02d:%02d \r\n",mon[getmonth(dt)-1], getday(dt),
getyear(dt),gethour(dt),getminute(dt),getsecond(dt));
info+="Log thread started. ====================================================>\r\n\r\n";
WriteLog( g_logdir, info);
//printf("system log is on\n");
g_mon->printf("start logging ...\r\n");
mon_addr="127.0.0.1";
//if log thread is not being shutdown.
while( !th_log->IsShutdown())
{
//if not connect
if( sock==NULL)
{
sock = new StdSocket();
if( !sock->Connect( mon_addr, mon_port))
{
delete sock;
sock=NULL;
info.Format( "Can't connect to monitor server %s,%s !\n", (LPCSTR)svr_addr, (LPCSTR)mon_port);
info+="Wait for trying again 10 seconds later.\r\n\r\n";
WriteLog( g_logdir, info);
Sleep( 10 * 1000);
continue;
}
}
if( ReadInfo( th_log, sock, info))
WriteLog( g_logdir, info);
else
{
delete sock;
sock=NULL;
}
}
if( sock) delete sock;
info.Format("\r\n%s %02d %4d %02d:%02d:%02d \r\n",mon[getmonth(dt)-1], getday(dt),
getyear(dt),gethour(dt),getminute(dt),getsecond(dt));
info+="Log thread stopped. <====================================================\r\n\r\n";
WriteLog( g_logdir, info);
if( lpfile)
{
(*lpfile).Close();
delete lpfile;
}
JTHREAD_EXIT( 0);
}
/////////////////////////////////////////////////////////////////////
//
//
#ifdef _DEBUG
//CString debug_dlsrv_proc;
CString debug_dlsrv_allthread;
CString debug_dlsrv_mt;
THREAD_RETTYPE WINAPI th_debug(JThread *th ){
CString _D_str;
CStdioFile _D_f;
int k=0;;
char dtbuf[250];
CString debug_dlsrv_allthread,debug_dlsrv_mt;
dtstring(dtbuf,nowtime(),"YYYY_MM_DD%hh_mm_ss");
debug_dlsrv_allthread.Format("c:\\temp\\%s_dlsrv_allthread.lst",dtbuf);
debug_dlsrv_mt.Format("c:\\temp\\%s_dlsrv_mt.lst",dtbuf);
while(!th->IsShutdown())
{
JThread::Sleep(1000);
k++;
if(k==30)
{
k=0;
remove(debug_dlsrv_allthread);
DumpAllThreadStack(debug_dlsrv_allthread);
if(_D_f.Open(debug_dlsrv_mt,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyWrite)){
CSyncObject::dumpmt(_D_str);
_D_f.WriteString(_D_str);
_D_f.Close();
}
}
}
JTHREAD_EXIT(0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -