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

📄 gwmain.cpp

📁 SMS gateway. SMS protocol for CHINA mobile, unicom, lingtong. Using mysql to exchange message.
💻 CPP
字号:
/**********************************************************************  FileName            : GWmain.cpp  Description         : 短消息代理网关主程序  Version             : 1.0  Date                : 2003年6月12日  Author              : 刘荣辉  Other               : ***********************************************************************/#include "GateWay.h"//发信号给各个线程以中断其工作,便于实时检查退出标志并做出响应void ForExit(int sig){	//printf("\n ForExit-------------- \n");	return;}//======================================//static pthread_key_t ThreadKey;		//线程TSD键//======================================int main(){  int i;  int RetCode;  CGateWay GateWay;  ThreadParam ThrParam;  pthread_attr_t ThreadAttr;  char sSysEvent[SYS_EVENT_LEN];//记录系统事件的字符串  pthread_t tmpthread;     GateWay.MainThr=pthread_self();  #ifdef DEBUG  printf("\nGateWay is starting, Thread_ID=[%d].\n",(int)GateWay.MainThr);  #endif  signal(SIGINT, CGateWay::ExitSig);		//Ctrl+C  signal(SIGTERM, CGateWay::ExitSig);	//kill PID  //for(int SigVal=1; SigVal<33 && SigVal!=SIGUSR1; SigVal++)	//收到任何信号都会安全退出	//signal(SigVal, CGateWay::ExitSig);  signal(SIGUSR1, ForExit);	//让所有线程实时响应主线程的退出通知  //--------------------网关初始化-----------------------    RetCode = GateWay.Initialize();  if(RetCode)  {     printf("Error[%d]: Failed to initialize GateWay,EXIT!\n",RetCode);     exit(1);  }  sprintf(sSysEvent,"LOG: GateWay initialized successfully! Thread_ID=[%d].",(int)GateWay.MainThr);  GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);       #ifdef DEBUG  printf("\n SystemLogFile=%s, GWCode=%s, GWIp=%s, \n GWPort=%d, IniFile[0]=%s, IniFile[1]=%s,\n",GateWay.SystemLogFile,GateWay.GWCode,GateWay.GWIp,GateWay.GWPort,GateWay.UpNode_IniFile[0],GateWay.UpNode_IniFile[1]);  	  #endif  //----------------------上节点初始化-----------------------  for(i=0;i<UPNODE_NUM;i++)  {  	GateWay.UpNode[i].WrSystemLog = GateWay.WrSystemLog;  	//--------------------上节点1初始化----------------------- 	RetCode = GateWay.UpNode[i].GetParam(GateWay.UpNode_IniFile[i]);  //获取上节点1的配置信息 	if(RetCode) 	{  	   sprintf(sSysEvent,"Error[%d]: Failed to load Parameters of GateWay.UpNode[%s] from File[%s]",RetCode,GateWay.UpNode[i].NodeCode,GateWay.UpNode_IniFile[i]); 	   GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 	} 	RetCode = GateWay.UpNode[i].NodeInit(); 	if(RetCode)	 	{ 	   sprintf(sSysEvent,"Error[%d]: Failed to initialize GateWay.UpNode[%s]!",RetCode,GateWay.UpNode[i].NodeCode); 	   GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	}	sprintf(sSysEvent,"LOG: GateWay.UpNode[%s] initialized successfully!",GateWay.UpNode[i].NodeCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	#ifdef DEBUG 	printf("\n Node_Infor[%d]: DeliverLogFile=%s, Protocol=%d, NodeCode=%s, SP_Id=%s, \n SP_Code=%s, NodeIp=%s, Port=%d, Secret=%s, Sent_Window_Size=[%d].\n",i,GateWay.UpNode[i].DeliverLogFile,GateWay.UpNode[i].Protocol,GateWay.UpNode[i].NodeCode,GateWay.UpNode[i].SP_Id,GateWay.UpNode[i].SP_Code,GateWay.UpNode[i].NodeIp,GateWay.UpNode[i].Port,GateWay.UpNode[i].Secret,GateWay.UpNode[i].Sent_Window_Size);	#endif  }    //-------------------------------------------  pthread_key_create(&ThreadKey,NULL);	//创建线程TSD键  //设定线程属性为绑定  pthread_attr_init(&ThreadAttr);  pthread_attr_setscope(&ThreadAttr, PTHREAD_SCOPE_SYSTEM);   for(i=0; i<UPNODE_NUM; i++)  {     ThrParam.MyInt = 1;	//mode,登录模式     ThrParam.MyPointer = &GateWay.UpNode[i];	//节点对象	 //产生上节点连接/登录线程     RetCode = pthread_create(&tmpthread,&ThreadAttr,GateWay.UpNode[i].NodeCom,(void *)&ThrParam);     if(RetCode)     {		sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.UpNode[%d]->NodeCom(),EXIT!",RetCode,i);		GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);		exit(1);     }  }  //上端已发送队列定时(轮询)线程  RetCode = pthread_create(&GateWay.UpSentQ_PollThr,NULL,GateWay.Up_SentQ_Poller,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.Up_SentQ_Poller(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //上端接收队列轮询/调度处理线程  RetCode = pthread_create(&GateWay.UpRecvQ_PollThr,&ThreadAttr,GateWay.Up_RecvQ_Poller,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.Up_RecvQ_Poller(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //数据库中的MT短消息分发线程号  RetCode = pthread_create(&GateWay.MTForwordThr,&ThreadAttr,GateWay.MTForword,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.MTForword(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //数据库中的MO短消息分发线程号  RetCode = pthread_create(&GateWay.MOForwordThr,&ThreadAttr,GateWay.MOForword,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.MOForword(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //产生下节点连接监听线程  RetCode = pthread_create(&GateWay.DnListenThr,&ThreadAttr,GateWay.DnListener,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.DnListener(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //产生下端接收线程  RetCode = pthread_create(&GateWay.DnRecvThr,&ThreadAttr,GateWay.DnReceiver,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.DnReceiver(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //产生下端已发送队列定时(轮询)线程函数  RetCode = pthread_create(&GateWay.DnSentQ_PollThr,&ThreadAttr,GateWay.Dn_SentQ_Poller,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.Dn_SentQ_Poller(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //产生下端接收队列轮询/调度处理线程  RetCode = pthread_create(&GateWay.DnRecvQ_PollThr,&ThreadAttr,GateWay.Dn_RecvQ_Poller,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.Dn_RecvQ_Poller(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }  //产生上端处理线程组(池)?????    //产生控制台线程(建立socket监听/执行来自特定IP的命令字符串):目前不做  //目前直接调用控制台函数,解析执行键盘输入的命令  RetCode = pthread_create(&GateWay.ConsoleThr,NULL,GateWay.Console,(void *)&GateWay);  if(RetCode)  {	sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.Console(),EXIT!",RetCode);	GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);	exit(1);  }    strcpy(sSysEvent,"LOG: Threads generated! Main thread is sleeping.");  GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);   //写系统日志  for(;;)  {  	sleep(999999999);		if(CGateWay::ToExit)	{		GateWay.SafeExit();		break;	}  }  strcpy(sSysEvent,"LOG: GateWay Main thread EXIT!\n=======================================\n");  GateWay.WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);   //写系统日志    return 0;}

⌨️ 快捷键说明

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