📄 func.cpp
字号:
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <time.h>
#include <sys/timeb.h>
#include <stdio.h>
#include <winsock2.h>
#include <direct.h>
#include <stdarg.h>
#include <wchar.h>
#include <STDLIB.H>
#include "gw.h"
#include "func.h"
#include "sock.h"
CArg arg;
DWORD WINAPI MOThread(LPVOID pp)
{
struct sockaddr_in fsin;
char buffer[SMPPMAXLENGTH];
char strSQL[512];
fd_set rfds,afds;
int alen;
DWORD fdindex;
timeval tv;
DWORD ret=0;
CMSG msg;
while(arg.isMO<1)SleepEx(10000,1);
tv.tv_sec=10;
tv.tv_usec=0;
alen=0;
arg.ms=passiveTCP(arg.szService,5);
FD_ZERO(&afds);
FD_SET(arg.ms,&afds);
if(arg.ms<1||arg.ms==-1)
{
SleepEx(10000,0);
return ExitFromNetClose;
}
if(arg.isDebug)AddLog("begin to get mo\n");
while(1)
{
if(arg.isStop)return 0;
memcpy(&rfds,&afds,sizeof(afds));
fdindex=select(FD_SETSIZE,&rfds,(fd_set*)0,(fd_set*)0,
(struct timeval*)&tv);
arg.dwRecv++;
if(fdindex==SOCKET_ERROR)//network error
{
AddLog("select error for %d\n",GetLastError());
SleepEx(20*1000,1);
goto cleanupmo;
}
else if(fdindex==0)
{
continue;//time expired
}
//data is coming.
if(FD_ISSET(arg.ms,&rfds))
{
SOCKET ssock;
alen=sizeof(fsin);
ssock=accept(arg.ms,(struct sockaddr*)&fsin,&alen);
if(ssock==INVALID_SOCKET)
{
AddLog("accept error for %d\n",GetLastError());
goto cleanupmo;
}
else if(ssock==0)goto cleanupmo;
FD_SET(ssock,&afds);
if(arg.isDebug)
AddLog("server %d.%d.%d.%d socket is connected.\n",
(BYTE)fsin.sin_addr.S_un.S_un_b.s_b1,
(BYTE)fsin.sin_addr.S_un.S_un_b.s_b2,
(BYTE)fsin.sin_addr.S_un.S_un_b.s_b3,
(BYTE)fsin.sin_addr.S_un.S_un_b.s_b4);
}//if isset msock
for(fdindex=0;fdindex<rfds.fd_count;fdindex++)
{
SOCKET fd=rfds.fd_array[fdindex];
if(fd!=arg.ms&&FD_ISSET(fd,&rfds))//process the next package.
{
int i,j;
i=j=0;
if(RecvBuffer(fd,buffer))
{
if(arg.isDebug)
AddLog("server socket is closed.\n");
closesocket(fd);
FD_CLR(fd,&afds);
continue;//continue to process the next socket
}//end of if
//now , the package should be processed.
memset(&msg,0,sizeof(CMSG));
msg.dwCommand=(GetNByte(buffer+4,4)+0x80000000);
msg.dwSequence=GetNByte(buffer+8,4);
msg.dwSequence2=GetNByte(buffer+12,4);
msg.dwSequence3=GetNByte(buffer+16,4);
msg.dwResult=0;
try
{
switch(GetNByte(buffer+4,4))
{
case SGIP_BIND:
if(arg.isDebug)
AddLog("Server is binding.\n");
i=InitMsg(buffer,&msg);//bind ok
if(send(fd,buffer,i,0)<i)closesocket(fd);
break;
case SGIP_DELIVER:
strncpy(msg.SrcTermId,buffer+20+2,21);
strncpy(msg.DstTermId,buffer+41,21);
msg.msg_format=buffer[64];
msg.msg_len=GetNByte(buffer+65,4);
for(i=0;i<msg.msg_len;i++)
sprintf(msg.szContent+i*2,"%.2x",
(BYTE)(buffer[69+i]));
msg.msg_len*=2;
//ismg_id,src,msg,msg_format,dst,channel,linkid
sprintf(strSQL,"exec sp_insert_mo '%.10d%d','%s',0x%s,%d,'%s',%d,'%s'",
GetNByte(buffer+12,4),//id_time
GetNByte(buffer+16,4),//id_sn
msg.SrcTermId,//src_termid
msg.szContent,//msg
msg.msg_format,//msg_format
msg.DstTermId,//dst_termid
arg.iChannelNum,//channel number.
buffer+GetNByte(buffer,4)-8//LinkID
);
AddResp("MO",0,"%.10d%d,%s,0x%s,%d,%s,%d,%s\n",
GetNByte(buffer+12,4),//id_time
GetNByte(buffer+16,4),//id_sn
msg.SrcTermId,//src_termid
msg.szContent,//msg
msg.msg_format,//msg_format
msg.DstTermId,//dst_termid
arg.iChannelNum,//channel number.
buffer+GetNByte(buffer,4)-8//LinkID
);
if(arg.isDebug)AddLog("%s\n",strSQL);
i=InitMsg(buffer,&msg);
if(send(fd,buffer,i,0)<i)closesocket(fd);
arg.pCnnGSM->Errors->Clear();
arg.pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
break;
case SGIP_UNBIND:
i=InitMsg(buffer,&msg);
send(fd,buffer,i,0);
closesocket(fd);
if(arg.isDebug)
AddLog("%d unbind.\n",fd);
FD_CLR(fd,&afds);
break;
case SGIP_REPORT:
if((BYTE)buffer[32]==0)
{
sprintf(strSQL,"EXEC SP_STATE_REPORT %d,'%.10d%d','%.21s','%d','%d'",
arg.iChannelNum,
GetNByte(buffer+24,4),//id2
GetNByte(buffer+28,4),//id3
buffer+35,//dst_termid,skim 86
buffer[54],//state
buffer[55]//error code where state=2,else error=0
);
if(arg.isDebug)AddLog("report <%s>.\n",strSQL);
arg.pCnnGSM->Errors->Clear();
arg.pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
AddResp("Status",0,"%d,%.10d%d,%.21s,%d,%d\n",
arg.iChannelNum,
GetNByte(buffer+24,4),//id2
GetNByte(buffer+28,4),//id3
buffer+35,//dst_termid,skim 86
buffer[54],//state
buffer[55]//error code where state=2,else error=0
);
msg.dwResult=0;
}else msg.dwResult=1;
arg.isActive=2;
ret=InitMsg(buffer,&msg);//result=0 means right. else error.
#if ONESECTION1
EnterCriticalSection(&(arg.syc1));
#endif
send(arg.s,buffer,ret,0);
#if ONESECTION1
LeaveCriticalSection(&(arg.syc1));
#endif
break;
}//end of swtich
//end of processing a package.
}//try
catch (_com_error &e)
{
AddLog("Process msg error.\n<%s>\n",strSQL);
AddLog("Description = '%s'\n", (char*) e.Description());
goto cleanupmo;
}
//end of to process the msg package.
}//end of isset
}//end of for
}
cleanupmo:
return 0;
}
GW_API DWORD BeginGW(LPVOID pp)
{
WSAData wsaData;
DWORD dwRet;
HANDLE h[3];
DWORD dwRecv,dwSend;
WSAStartup(0x202,&wsaData);
if(!GetArg(&arg))
{
SleepEx(1000*10,1);
return 1;
}
if(arg.isDebug)AddLog("GW.dll is beginning.\n\n");
dwRet=0;
ResetEvent(arg.hGW);
h[0]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))MTThread,0,0,0);
h[1]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))MOThread,0,0,0);
h[2]=arg.hGW;
dwRecv=dwSend=0;
while(1)
{
dwRet=WaitForMultipleObjects(3,h,FALSE,20*1000);
switch(dwRet)
{
case WAIT_FAILED: //error:
AddLog("WSAWaitFor Error\n");
return 0;
break;
case WAIT_TIMEOUT:
SendCheck(arg.szSub);
AddLog("seq: <%d-%d>(%d-%d)\n",dwSend,arg.dwSend,dwRecv,arg.dwRecv);
if((dwRecv>arg.dwRecv&&arg.isMO)||(dwSend>arg.dwSend&&arg.isMO%2==0))
{
arg.isStop=2;
if(arg.isDebug)
AddLog("No data, thread will rerun.\n");
dwRecv=arg.dwRecv;
dwSend=arg.dwSend;
//TerminateThread(h[0],0);
//TerminateThread(h[1],0);
goto RET_003;
}
dwRecv++;dwSend++;
if(dwRecv<arg.dwRecv)dwRecv=arg.dwRecv;
if(dwSend<arg.dwSend)dwSend=arg.dwSend;
break;
case WAIT_OBJECT_0: //mt_thread exit here
GetExitCodeThread(h[0],&dwRet);
if(arg.isDebug)AddLog("mt_thread exit.\n");
if(dwRet==ExitFromNetClose||dwRet==0)
{
//TerminateThread(h[1],0);
goto RET_003;
}
CloseHandle(h[0]);
h[0]=(HANDLE)_beginthreadex(NULL,0,
(unsigned int(__stdcall*)(void*))MTThread,0,0,0);
if(h[0]==NULL)
{
//TerminateThread(h[1],0);
goto RET_003;
}
break;
case WAIT_OBJECT_0 +1://mo thread exit here.
GetExitCodeThread(h[1],&dwRet);
if(arg.isDebug)AddLog("MOThread exit for %d.\n",dwRet);
if(dwRet==ExitFromNetClose||dwRet==0)
{
//TerminateThread(h[0],0);
goto RET_003;
}
CloseHandle(h[1]);
h[1]=(HANDLE)_beginthreadex(NULL,0,
(unsigned int(__stdcall*)(void*))MOThread,
0,0,0);
if(h[1]==NULL)
{
//TerminateThread(h[0],0);
goto RET_003;
}
break;
case WAIT_OBJECT_0+2: //EventForExit
AddLog("Get msg to stop GW.\n");
goto RET_003;
break;
}//switch(dwRet)
}//end fo while (1)
RET_003:
arg.isStop=0x7e;
//SleepEx(1000,1);
WSACleanup();
AddLog("exit BeginGW\n");
if(arg.pCnnGSM->GetState())arg.pCnnGSM->Close();
//::CoUninitialize();
#if ONESECTION1
DeleteCriticalSection(&(arg.syc1));
#endif
#if ONESECTION2
DeleteCriticalSection(&(arg.syc2));
#endif
#if ONESECTION3
DeleteCriticalSection(&(arg.syc3));
#endif
return 0;
}
void PutByteString(char* dest,
char* source,
int length)
{
int i=0;
if(source==NULL)return;
for(i=0;i<length;i++)
dest[i]=source[i];
}
void PutNByte(char* buffer,BYTE b,DWORD in)
{
int i;
if(b>4)b=4;
for(i=0;i<b;i++)
{
*(buffer+b-1-i)=char(in&0xFF);
in>>=8;
}
}
DWORD GetTime()
{
char date[20],time[20];
int ret=0;
_strdate(date);
_strtime(time);
date[2]=date[3];
date[3]=date[4];
memcpy(date+4,time,2);
memcpy(date+6,time+3,2);
memcpy(date+8,time+6,2);
date[10]=0;
ret=atoi(date);
return ret;
}
DWORD GetTimeMillSec()
{
int ret=0;
struct _timeb timebuffer;
_ftime(&timebuffer);
ret=timebuffer.millitm+timebuffer.time%3600*1000;
return ret;
}
void GetTime(char* buffer,int period)
{
char date[20],time[20];
int d,h,m;
int year,month;
_strdate(date);
_strtime(time);
m=atoi(time+3)+period;
h=m/60+atoi(time);m%=60;
d=h/24+atoi(date+3);h%=24;
month=atoi(date);
year=atoi(date+6);
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(d>31){month+=d/31;d%=31;}
break;
case 4:
case 6:
case 9:
case 11:
if(d>30){month+=d/30;d%=30;}
break;
case 2:
if((year%4==0&&year%100>0)||year%400==0){
if(d>29){month+=d/29;d%=29;}
}else
{
if(d>28){month+=d/28;d%=28;}
}
}
if(month>12){year+=month/12;month%=12;}
sprintf(buffer,"%.2d%.2d%.2d%.2d%.2d%.2d",
year,month,d,h,m,atoi(time+6));
strcpy(buffer+12,"032+");
}
DWORD GetNByte(char* buffer,BYTE b)
{
int i;
DWORD rt=0;
if(b>4)b=4;
for(i=0;i<b;i++)
rt=rt*256+*(unsigned char*)(buffer+i);
return rt;
}
long Jstrncpy(char* dest,
const char* source,
long size)
{
UINT i=0;
memset(dest,0,size);
if(source==NULL)return 0;
if((long)strlen(source)>=size)
strncpy(dest,source,size);
else
strcpy(dest,source);
return (long)strlen(dest);
}
int InitMsg(char* buffer,CMSG* msg)
{
int i,j,k;
unsigned __int16 tp;
char tmp[50];
BYTE b;
memset(buffer,0,SMPPMAXLENGTH);
tp=j=k=i=0;
i+=4;
PutNByte(buffer+i,4,msg->dwCommand);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -