📄 func.cpp
字号:
#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <sys/timeb.h>
#include <stdio.h>
#include <winsock2.h>
#include <direct.h>
#include <stdarg.h>
#include "gw.h"
#include "func.h"
#include <wincon.h>
#include <stdlib.h>
#define BEEPER 0
CArg arg;
DWORD GetNum(_RecordsetPtr rs,LPCTSTR index);
int GetStr(_RecordsetPtr rs,LPCTSTR index,_bstr_t Item);
_bstr_t GetStr(_RecordsetPtr rs,LPCTSTR index);
DWORD GetNum(_RecordsetPtr rs,LPCTSTR index)
{
long out=0;
if(rs->GetRecordCount()==0)return 0;
sscanf((LPCSTR)(_bstr_t)rs->GetFields(
)->GetItem(index)->Value,
"%d",&out);
return (unsigned long)out;
}
int GetStr(_RecordsetPtr rs,LPCTSTR index,_bstr_t Item)
{
if(rs->Fields->GetItem(index)->GetActualSize()<1)return 0;
Item=_bstr_t(rs->Fields->GetItem(index)->Value);
return strlen((LPSTR)Item);
}
_bstr_t GetStr(_RecordsetPtr rs,LPCTSTR index)
{
if(rs->Fields->GetItem(index)->GetActualSize()<1)
return _bstr_t((char*)NULL);
return _bstr_t(rs->Fields->GetItem(index)->Value);
}
GW_API DWORD BeginGW(LPVOID pp)
{
DWORD dwRet;
struct sockaddr_in server;
WSAData wsaData;
HANDLE hEvent[4];
memset(&server,0,sizeof(server));
WSAStartup(0x202,&wsaData);
dwRet=0;
while(1)
{
if(!GetArg(&arg))
{
//SleepEx(1000*10,1);
#if BEEPER
Beep(17600,10000);
#endif
return 1;
}
#if !_DEBUG
if(atoi(arg.ESMEID)<10000)
{
AddLog("不合法的服务代码。\n");
return 1;
}
#endif
server.sin_family = AF_INET;
server.sin_port = htons(arg.SMSCPORT);
server.sin_addr.s_addr = inet_addr(arg.SMSCIP);
arg.s = socket(AF_INET,SOCK_STREAM,0); /* Open a socket */
setsockopt(arg.s,IPPROTO_TCP,SO_REUSEADDR,(char*)1,4);
if (arg.s <0 )
{
AddLog("打开socket错误\n");
WSACleanup();
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR)
{
AddLog(TEXT("调用WSAStartup失败。\n"));
#if BEEPER
Beep(8800,1000);
#endif
WSACleanup();
}
}
else if(connect(arg.s,
(struct sockaddr*)&server,
sizeof(server))== SOCKET_ERROR)
{
if(dwRet<1)
AddLog("不能连接EHOO中心服务器<错误号:%d>.\n",GetLastError());
dwRet++;
if(dwRet>arg.nMaxReconnect)
{
if(arg.isDebug)
AddLog("重新连接%d次仍然失败。重新运行服务。\n",arg.nMaxReconnect);
#if BEEPER
Beep(4400,10000);
#endif
//return 1;
}
//SleepEx(10*1000,1);
closesocket(arg.s);
WSACleanup();
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR)
{
AddLog(TEXT("调用WSAStartup失败。\n"));
WSACleanup();
}
}else break;
}
AddLog("成功连接EHOO中心服务器。\n");
#if 0
////////////////testfun runs here.
testfun2(arg.s);
return 0;
///////////////////
#endif
ResetEvent(arg.hGW);
//begin service.
//create the read thread
hEvent[0]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))SenderMsg,0,0,0);
hEvent[1]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))ReceiverMsg,0,0,0);
hEvent[2]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))DeliverMsg,0,0,0);
hEvent[3]=arg.hGW;
while(1)
{
dwRet=WaitForMultipleObjects(4,hEvent,FALSE,INFINITE);
switch(dwRet)
{
case WAIT_FAILED: //error:
AddLog("调用WaitForMultipleObjects失败。\n");
return ExitFromWaitFailed;
break;
case WAIT_TIMEOUT:
break;
case WAIT_OBJECT_0: //sender exit here
CloseHandle(hEvent[0]);
hEvent[0]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))SenderMsg,
(LPVOID)arg.s,0,0);
if(hEvent[0]==NULL){StopGW();return 0;}
break;
case WAIT_OBJECT_0 +1://receiver exit here.
arg.isActive=0;
GetExitCodeThread(hEvent[1],&dwRet);
if(dwRet==NOERROR)return NOERROR;
CloseHandle(hEvent[1]);
if(dwRet==ExitFromNetClose)
{
closesocket(arg.s);
WSACleanup();
WSAStartup(0x202,&wsaData);
dwRet=0;
while(1)
{
if(dwRet>arg.nMaxReconnect)
{
AddLog("重新连接 %d 次仍然失败,退出服务.\n",arg.nMaxReconnect);
Exec("update msg_smsc set msg_state=100 where msg_state=101");
StopGW();
return 0;
}
arg.s = socket(AF_INET,SOCK_STREAM,0);
if (arg.s <0 )
{
AddLog("打开socket失败。\n");
WSACleanup();
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR)
{
AddLog(TEXT("调用WSAStartup失败。\n"));
WSACleanup();
}
}
else if(connect(arg.s,
(struct sockaddr*)&server,
sizeof(server))== SOCKET_ERROR)
{
SleepEx(20*1000,1);
AddLog("连接EHOO中心服务器失败。\n");
closesocket(arg.s);
dwRet++;
}else
{
AddLog("重连EHOO中心服务器成功。\n");
//dwRet=InitMsg(BIND,buffer,0,0);
//send(arg.s,buffer,dwRet,0);
break;
}
}
}
hEvent[1]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))ReceiverMsg,
(LPVOID)arg.s,0,0);
if(hEvent[1]==NULL)
{
StopGW();
return 0;
}
break;
case WAIT_OBJECT_0+2:
hEvent[2]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))DeliverMsg,0,0,0);
if(hEvent[2]==NULL)
{
StopGW();
return 0;
}
break;
case WAIT_OBJECT_0+3: //EventForExit
//ResetEvent(arg.hGW);
AddLog("得到消息,准备退出子服务。\n");
ExitThread(0);
break;
}//switch(dwRet)
}//end fo while (1)
ExitThread(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);
ret=atoi(date);
return ret;
}
void GetStamp(char* buffer)
{
char date[20],time[20];
_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);
PutNByte(buffer,4,atoi(date));
}
void GetLastday(char* buffer)
{
char current[36];
char tp[36];
int day[]={31,28,31,30,31,30,31,31,30,31,30,31};
struct _timeb timebuffer;
int i,j,k;
_strdate(current);
j=atoi(current);//month
k=atoi(current+3);//day
_ftime(&timebuffer);
strcpy(tp,ctime(&(timebuffer.time)));
tp[strlen(tp)-1]=0;
i=atoi(strrchr(tp,' '));//year
if(k>1)
{
sprintf(buffer,"%.4d%.2d%.2d",i,j,k-1);
return;
}
else
{
if(j==1){i--;j=12;}
j--;
if(j==2)
{
if(j%4)k=28;
else if(j%100==0&&j%400)k=28;
else k=29;
}
else k=day[j-1];
sprintf(buffer,"%.4d%.2d%.2d",i,j,k);
}
}
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;
ZeroMemory(dest,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(DWORD nCOMMANDID,
char* buffer,
char* mobile,
char* sm,DWORD id_time,DWORD id_sn,DWORD validate,DWORD state)
{
int i,j,k;
unsigned __int16 tp;
BYTE b;
char tmp[5];
ZeroMemory(buffer,SMPPMAXLENGTH);
tp=j=k=i=0;
i+=4;
PutNByte(buffer+i,4,nCOMMANDID);
i+=4;
PutNByte(buffer+i,4,id_time);//sequence no
i+=4;
switch(nCOMMANDID)
{//hbzb@public.wh.hb.cn
case SUBMIT:// 3
/////////////////////////////////
//mobile number
if(strlen(mobile)<11)return 0;
if(strlen(sm)<1||strlen(sm)>MSGLEN)return 0;
PutNByte(buffer+i,4,id_time);
i+=4;
PutNByte(buffer+i,4,1);//id_sn);
i+=4;
buffer[i]=1;//pk_total
i++;
buffer[i]=1;//pk_number
i++;
buffer[i]=1;//need_reply
i++;
buffer[i]=0;//msg level
i++;
sprintf(buffer+i,"%s\0",arg.ESMEID);//service_id
i+=10;
buffer[i]=2;//Fee_UserType
i++;
ZeroMemory(buffer+i,21);
i+=21;//the fee_dest_termid is skimmed
buffer[i]=0;//TP_pid
i++;
buffer[i]=0;//TP_udhi
i++;
/////////////////////////////////////
buffer[i]=(BYTE)id_sn;
i++;
PutNByte(buffer+i,4,atoi(arg.ESMEID));//sp_id
i+=6;
sprintf(buffer+i,"%.2d",5);
i+=2;//fee_type
sprintf(buffer+i,"%.6d",0);
i+=6;//fee_code
//j=day
//k=hour
if((validate/60)>=48)j=2;
else if((validate/60)>=24)j=1;
else j=0;
k=(validate%1440)/60;//yymmddhhmmsstnnp
sprintf(buffer+i,"%.6d%.2d%.2d00320+\0",j,k,validate%60);//validate time
i+=17;
sprintf(buffer+i,"%.10d00320+\0",1);//重发时间间隔
i+=17;
ZeroMemory(buffer+i,21);
i+=21;//src_termid is skimmed
buffer[i]=1;//number of dsttermid
i++;
sprintf(buffer+i,"%s\0",mobile);//dst_termid
i+=21;
if(id_sn==3||id_sn==4||id_sn==8)
{
buffer[i]=strlen(sm)/2;
i++;
for(int j=0;j<(BYTE)buffer[i-1];j++)
{
sprintf(tmp,"0x%.2s\0",sm+j*2);
sscanf(tmp,"%x",&b);
buffer[i+j]=b;
}
i+=buffer[i-1];
}else
{
buffer[i]=strlen(sm);
i++;
if(strlen(sm)<=160)
strncpy(buffer+i,sm,strlen(sm));
i+=strlen(sm);
}
i+=8;//reserved 8 bytes
//////////////////////////////
break;
case BIND:// over
sprintf(buffer+i,"%.10s\0",arg.ESMEID);//service_id
i+=10;
Jstrncpy(buffer+i,arg.ESMEPWD,16);
//sprintf(buffer+i,"%d\0",getHardDriveComputerID());
i+=16;
buffer[i]=12;
i++;
GetStamp(buffer+i);
i+=4;
break;
case UNBIND://over
break;
case DELIVERYRESP://over
i-=4;
PutNByte(buffer+i,4,validate);//sequence no
i+=4;
memcpy(buffer+i,sm,8);
i+=8;
buffer[i]=(BYTE)state;//0=right result
i++;
break;
case CANCEL://over
//cancel the messagea to MSG_id in first 8 bytes of mobile
memcpy(buffer+i,mobile,8);
i+=8;
break;
case QUERYSTATUS:
//query the message to mobile
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -