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