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

📄 func.cpp

📁 (R)-VC++-Code-cmpp企业短信助理-源代码全
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -