📄 dnlistener.cpp
字号:
/**********************************************************************
FileName : DnListener.cpp
Description : 下端连接监听线程
Version : 1.0
Date : 2003年9月9日
Author : 刘荣辉
Other :
***********************************************************************/
#include "GateWay.h"
void * CGateWay::DnListener(void * pGateway)
{
int RetCode,Num;
int threadid;
char sSysEvent[SYS_EVENT_LEN];
pthread_t tmpthread;
int len;
CGateWay *Gateway;
ThreadParam3 *ThrParam;
Gateway=(CGateWay *)pGateway;
threadid = pthread_self();
pthread_detach(threadid);
sprintf(sSysEvent,"LOG: DnListener[%d] for DownNodes is started.",threadid);
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志
len = sizeof(struct sockaddr_in);
sleep(2); //等待其他线程完成初始化工作
while(1) //重新建立新的连接监听套接字
{
Gateway->DnSock->SetTimeOut(36000);
RetCode = Gateway->DnSock->Make_Listen_Sock(Gateway->GWIp, Gateway->GWPort);
if(RetCode <= 0)
{
sprintf(sSysEvent,"Error[%d]: Failed to make Listening Socket [%s::%d], EXIT!",RetCode,Gateway->GWIp,Gateway->GWPort);
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
exit(1);
}
for(;;) //不断监听接受连接
{
if(Gateway->ToExit) //检查系统退出标志
{
Gateway->DnSock->Close_sock();
goto DnListenEnd;
}
sprintf(sSysEvent,"LOG: DnListener is Waiting for connection from a DownNode on Socket [%s::%d]!",Gateway->GWIp,Gateway->GWPort);
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
ThrParam = (ThreadParam3 *)malloc(sizeof(ThreadParam3));
ThrParam->MyPointer = Gateway;
ThrParam->MyInt = accept(Gateway->DnSock->sock, (struct sockaddr *)&ThrParam->ClientIp, (socklen_t *)&len); //接受连接
if(ThrParam->MyInt >= 0)
{
if(Gateway->ToExit) //检查系统退出标志
{
close(ThrParam->MyInt);
Gateway->DnSock->Close_sock();
goto DnListenEnd;
}
//对ClientIp进行IP鉴权,防止非法IP访问
//一个IP只能对应一个服务代码(接入号)?????????????????
for (Num=0; Num < Gateway->DnNodeNum; Num++)
{
if(strcmp(inet_ntoa(ThrParam->ClientIp.sin_addr), Gateway->CP_Array[Num].NodeIp)==0)
break;
}
if(Num==Gateway->DnNodeNum) //非法IP访问,拒绝连接,记录
{
close(ThrParam->MyInt);
free(ThrParam); //释放线程参数所占内存
sprintf(sSysEvent,"Warning: Connection from illegal IP[%s] is CUT!",(char *)inet_ntoa(ThrParam->ClientIp.sin_addr));
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
continue;
}
else //记录合法IP的连接信息
{
sprintf(sSysEvent,"LOG: Get a Connection from DnNode[%s] with IP=[%s],Socket=[%d].",Gateway->CP_Array[Num].ServiceCode, (char *)inet_ntoa(ThrParam->ClientIp.sin_addr),ThrParam->MyInt);
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
}
//产生下端登录验证线程
RetCode = pthread_create(&tmpthread,NULL,Gateway->DnNodeLogin,(void *)ThrParam);
if(RetCode)
{
sprintf(sSysEvent,"Error[%d]: Cann't create thread for GateWay.DnNodeLogin(),Connection denied!",RetCode);
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
close(ThrParam->MyInt); //无法产生登录验证线程时,只好拒绝连接
free(ThrParam); //释放线程参数所占内存
}
}
else
{
Gateway->DnSock->Close_sock();
if(Gateway->ToExit) //检查系统退出标志
goto DnListenEnd;
sprintf(sSysEvent,"LOG: Accepting Connection timeout, Initializing another Listening Socket...");
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
break; //重新建立新的连接监听套接字
}
}//for(;;)
}//while(1)
DnListenEnd:
Gateway->DnListenThr=0;
if(Gateway->ToExit)
strcpy(sSysEvent,"LOG: DnListener of Gateway is ended! ");
else
strcpy(sSysEvent,"Error: DnListener of Gateway QUIT! ");
Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG);
return (void *)NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -