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

📄 main.cpp

📁 1)安装sp2补丁. 2)安装中文语言包. 3)关闭除系统盘除外的系统还原 4)控制面板->区域和语言选项->区域选项 选择中国,位置:选择中国.高级选项卡 非unicode程序的语
💻 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 + -