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

📄 smppsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		else iRet=-1;
	}

	return iRet;
}*/

/*void CSmppSock::OnClose(int nErrorCode) 
{
	fDisconnect();
	CSocket::OnClose(nErrorCode);
}*/




void CSmppSock::SetHostName(char *phost)
{
	strcpy(m_smscInfo.SMSCIP,phost);

}

void CSmppSock::SetPort(int port)
{
	m_smscInfo.uPort=port;

}

void CSmppSock::SetUser(char *puser, char *pwd)
{
	strcpy(m_smscInfo.usrName,puser);
	strcpy(m_smscInfo.passWd,pwd); 

}

void CSmppSock::ClearBuffer()
{
	FD_SET sockset = {1, m_hSocket};
	TIMEVAL tv = {0, 0};
    int result;
	int dRevLen;
	char buffer[MAX_SMPP_COM_BUF];
	while(1){
		result=select(0, &sockset, NULL, NULL, &tv);
		if(result>0)//while(1)// GetMessage(&msg, NULL, 0, 0) ) 
		{
			if ( FD_ISSET( m_hSocket, &sockset))
			{
					dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
					//if(dRevLen==0||dRevLen==SOCKET_ERROR )
			}
		}
		else
			break;
		if(dRevLen<=0||dRevLen==SOCKET_ERROR)
			break;
	}
}

int CSmppSock::GetRespState(int state, char *pcresp)
{
	char *pstr="";
	int result=0;
	switch(state)
	{
	//状态定义Command_status	错误代码	描述
	case E_SUCCESS:		pstr="成功";  result=1; break;//0X00000000
	case E_OTHERERR:    pstr="其他错误";  break;//             0X00000001              //	
	//0X00000002 - 0X0000000F	保留给SMSC厂商定义错误
	case E_MSGLENERR:  pstr="消息长度错误";  break;//               0X00000010              //	
	case E_CMDLENERR:    pstr="命令长度错误";  break;//              0X00000011              //	命令长度错误
	case E_INVLDCMDID:       pstr="消息ID无效";  break;//           0X00000012              //	
	case E_NORIGHT:        pstr="没有执行此命令的权限"; break;//          0X00000013              //	
	//0X00000014 - 0X0000001F	保留
	case E_INVLDSYSTEMID:    pstr="无效的SYSTEMID";  break;//              0X00000020              //	
	case E_INVLDPASSWORD:     pstr="无效的密码"; break;//             0X00000021              //	
	case E_INVLDSYSTEMTYPE:   pstr="无效的SYSTEMTYPE";  break;//               0X00000022              //	
//0X00000023 - 0X0000003F	保留
	case E_ADDRERR:  pstr="地址错误";   break;//
	case E_MOEXCEED: pstr="超过最大提交数";   break;//
	case E_MTEXCEED:  pstr="超过最大下发数";   break;//
	case E_INVLDUSER:        pstr="无效的用户";  result=1; break;//
	case E_INVLDDATAFMT:     pstr="无效的数据格式";   break;//
	case E_CREATEMSGFAILURE:   pstr="创建消息失败";   break;//
	case E_INVLDMSGID:         pstr="无效的短消息ID";   break;//
	case E_DATABASEFAILURE:    pstr="数据库失败";   break;//
	case E_CANCELMSGFAILURE:   pstr="取消消息失败";   break;//
	case E_MSGSTATEERR:        pstr="短消息状态错误";   break;//
	case E_REPLACEMSGFAILURE:   pstr="替换消息失败";   break;//
	case E_INVLDRPLADDR:        pstr="替换消息源地址错误";   break;//
//0X0000004C - 0X0000005F	保留
	case E_INVLDORGTON:         pstr="无效的源地址TON";  result=1;  break;//
	case E_INVLDORGNPI:         pstr="无效的源地址NPI";   result=1; break;//
	case E_ORGADDRERR:           pstr="源地址错误";   break;//
	case E_INVLDDESTTON:         pstr="无效的目的地址TON";   break;//
	case E_INVLDDESTNPI:          pstr="无效的目的地址NPI";   break;//
	case E_DESTADDRERR:           pstr="目的地址错误";   break;//
	case E_INVLDSCHEDULE:         pstr="无效的定时时间";   break;//
	case E_INVLDEXPIRE:           pstr="无效的超时时间";   break;//
	case E_INVLDESM :             pstr="无效的ESM_CALSS";   break;//
	case E_INVLDUDLEN:             pstr="无效的UDLEN";   break;//
	case E_INVLDPRI:            pstr="无效的PRI";   break;//
	case E_INVLDRDF:             pstr="无效的Registered_delivery_flag";   break;//
	case E_INVLDRPF:             pstr="无效的Replac#define E_if_present_flag";   break;//
	default:
		pstr="保留";   break;//
	}
	sprintf(pcresp,"返回值:%d 说明:%s",state,pstr);
	return result;
}

void CSmppSock::SetLife(int check,int hours, int minutes)
{
	m_life.bUsed=check;
	m_life.hours=hours;
	m_life.minutes=minutes;
}

void CSmppSock::SetFlashState(int state)
{
	m_bFlashMsg=state;
}

int CSmppSock::FillTimeStrToStr(char *ostr)
{
	CTime curtime=CTime::GetCurrentTime();
	curtime=curtime+CTimeSpan(0,m_life.hours,m_life.minutes,0);
	SYSTEMTIME systeme;
	curtime.GetAsSystemTime(systeme);
	char buf[20];
	sprintf(buf,"%02d%02d%02d%02d%02d%02d%1d%02d+",systeme.wYear-2000
		,systeme.wMonth,systeme.wDay,systeme.wHour,systeme.wMinute,systeme.wSecond,0,8);
	strcpy(ostr,buf);
	return strlen(buf)+1;
}

void CSmppSock::ReadAllMsg()
{
	BYTE buffer[MAX_SMPP_COM_BUF];
	memset(buffer,0,MAX_SMPP_COM_BUF);
	struct Smpp_MESSAGE_HEAD *phead=(struct Smpp_MESSAGE_HEAD *)buffer;

	//receive
	int dRevLen;
	UINT starttime=time(NULL);
	//MSG msg;
	while(1)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		ioctlsocket(m_hSocket,FIONREAD,(unsigned long *)&dRevLen);
		if(dRevLen<sizeof(Smpp_MESSAGE_HEAD))break;
		memset(phead,0,sizeof(Smpp_MESSAGE_HEAD));
		dRevLen=fReceive((BYTE*)&buffer,sizeof(MAX_SMPP_COM_BUF));
		if(dRevLen<sizeof(Smpp_MESSAGE_HEAD))break;

		if(phead->command_id>0x80000000&&phead->command_status!=E_SUCCESS)
		{
			Smpp_PRINTOUT("SMPP FAILED: command_id=%x,command_status=%x\r\n",phead->command_id,phead->command_status);
		}
		else
		{
			//Smpp_PRINTOUT("SMPP MSG: command_id=%x,command_status=%x\r\n",phead->command_id,phead->command_status);
			if(phead->command_id==0x00000015)
			{
				Smpp_PRINTOUT("SMPP:发送应答消息\r\n");
				phead->command_id=0x80000015;
				phead->command_status=0;
				phead->command_length=sizeof(Smpp_MESSAGE_HEAD);
				network_head(phead);
				//if(Send(buffer,packet_len)==SOCKET_ERROR)
				if(Send(buffer,sizeof(Smpp_MESSAGE_HEAD))==SOCKET_ERROR)
				{
					Smpp_PRINTOUT("SMPP:发送应答消息失败\r\n");
				}

			}
		}
		if(time(NULL)-starttime>MAX_ALIVETESTTIME)    //5--10s		
		{
		//	break;		
		}
	}
}

int CSmppSock::Receive(unsigned char *lpBuf, int nBufLen)
{
	unsigned char * buf;
	int byRet,ErrCode;
	int TempLen;			//every frame 2048 bytes
	int Num=0;
	TempLen=nBufLen;
	buf=lpBuf;

	while((byRet=recv (m_hSocket,(char *)buf,TempLen,0))!=TempLen)
	{
		if(byRet<0)
		{
			ErrCode=WSAGetLastError();
			if(ErrCode!= WSAEWOULDBLOCK)//block err closeconnect
			{
				return(-1);
			}
			else	//if no data not return byRet=0,return an err WSAEWOULDBLOCK
			{		//本来应正常退出,但在MPU关电时也返回WSAEWOULDBLOC,新开电无法正常连接,才调用退出
				nReceiveError++;
				if(nReceiveError>100)
				{
					return(-1);
				}
				return(0);
			}
		}
		else if(byRet==0)
		{
			return(0);
		}
		else
		{
			Num+=byRet;				
			buf+= byRet;
			TempLen=nBufLen-Num;
			if(TempLen<=0)return nBufLen;
		}
 	}
	nReceiveError=0;
	return nBufLen;
}

int CSmppSock::Send(unsigned char *pBuffer, int cLength)
{


  int cBytes,ErrCode;
  int TempLen;			//every frame 2048 bytes
  int TotalSize=cLength;
  int Num=0,SendNum=0;
  BOOL bBeginSend=FALSE;
  unsigned char *buf;
  buf=pBuffer;

  TempLen=cLength;
  while ((cBytes=send(m_hSocket,(char *)buf,TempLen,0))!=cLength)
  {
	 if(cBytes<0)
	 {
		ErrCode=WSAGetLastError();
		if(ErrCode!= WSAEWOULDBLOCK)
		{
			return(-1);
		}
		else
		{
			if(bBeginSend)
			{
				SendNum++;	//blocke err closeconnect
				if(SendNum>2000)
				{
					return(-1);
				}
				Sleep(5);
			}
			else
			{
				SendNum++;	//block err closeconnect
				if(SendNum>2000)
				{
					return(-1);
				}
				Sleep(5);
			}
		}
	}
	else
	{
		bBeginSend=TRUE;
		if(cBytes==cLength)
			return(TotalSize);
		Num+=cBytes;
		if(Num>TotalSize)	//lose frames
		{
			return(-1);
		}
		buf+= cBytes;
		cLength-= cBytes;
		if(cLength<MAX_SMPP_COM_BUF)
			TempLen=cLength;
	}
  }
	return(TotalSize);
}
//int CSmppSock::fSendSM(char* destaddr,char* sendmsg,char* srcaddr,BOOL bResp)
int CSmppSock::fSendWapSM(const char* destaddr,const char* srcaddr,const char* sendmsg,const char* http,bool bResp)
{
	//printf(destaddr); printf(" Submit +OK.\n");
	//return 1;
	char smc_msgid[20];
	if(!m_bConnected)
	{
		return -5;
	}
	if(!m_bAlive)
	{
		return -6;
	}
	if(destaddr[0]==0 || sendmsg[0]==0 )  
	{
		printf("FAILED: Submit , destadd or sendmsg is NULL") ;	
		return -1;
	}

	BYTE buffer[MAX_SMPP_COM_BUF];
	struct Smpp_MESSAGE_HEAD *phead=(struct Smpp_MESSAGE_HEAD *)buffer;
	BYTE* p=buffer+sizeof(struct Smpp_MESSAGE_HEAD);
	memset(buffer,0,MAX_SMPP_COM_BUF);
	//******************和短信中心接口*************************/
    /*************************和前置机接口***********************/
	
	*p++='0';	*p++=0;	//service_type
	*p++=1;		//pbody->source_address_ton=1;
	*p++=1;		//pbody->source_address_npi=1;
	bool world=false;
	if((destaddr[0]=='8'&&destaddr[1]=='6')||(destaddr[0]=='1'&&destaddr[1]=='3'&&destaddr[2]>'3'))
	{
		world=false;
		strcpy((char*)p,"861860");	p+=7;	//source_address
	}
	else
	{
		world=true;
		strcpy((char*)p,srcaddr);	p+=strlen(srcaddr)+1;	//source_address
	}
	*p++=1;		//pbody->dest_address_ton=1;
	*p++=1;		//pbody->dest_address_npi=1;
	if(destaddr[0]=='8'&&destaddr[1]=='6')
	{
		strcpy((char*)p,destaddr);	
		p+=strlen(destaddr)+1;	//source_address
	}
	else if(destaddr[0]=='1'&&destaddr[1]=='3'&&destaddr[2]>'3')
	{
		*p++='8';
		*p++='6';
		strcpy((char*)p,destaddr);	
		p+=strlen(destaddr)+1;	//source_address
	}
	else//国际
	{
		*p++='0';
		*p++='0';
		strcpy((char*)p,destaddr);	
		p+=strlen(destaddr)+1;	//source_address
	}
	*p++=64;		//pbody->esm_class=64=0x40
	*p++=0;		//pbody->protocol_ID=0;
	*p++=0;		//pbody->priority_flag=0; 
	*p++=0;		//schedule_delivery_time
	*p++=0;		//validity_peroid
	*p++=0;		//registered_delivery_flag 16
	*p++=0;		//replace_if_presend_flag

	*p++=245; //data_coding 
	*p++=0;		//sme_default_msgid
	p+=fill_wap_message(p,sendmsg,http);		//length and content
	/***********************************************************/

	phead->command_id=ESME_SUB_SM;
	phead->command_status=0;
	UINT packet_len=p-buffer;
	phead->command_length=packet_len;
	phead->sequence_no=m_sequence++;
	UINT send_sequence=phead->sequence_no; 

	network_head(phead);
	Send(buffer,packet_len);

	FD_SET sockset = {1, m_hSocket};
	TIMEVAL tv = {10, 0};
    int result=select(0, &sockset, NULL, NULL, &tv);
	
	int dRevLen;
//	UINT starttime=time(NULL);
	//MSG msg;
	if(result>0)//while(1)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		//TranslateMessage(&msg);
		//DispatchMessage(&msg);
		//IOCtl(FIONREAD,&dRevLen); 
		if ( FD_ISSET( m_hSocket, &sockset))
		{
#if 0
			while(1){
				dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
				break;
				if(dRevLen<=0)
					break;
				result=select(0, &sockset, NULL, NULL, &tv);
				if(result>0)
				{
					if ( FD_ISSET( m_hSocket, &sockset))
						continue;
					else
						break;
				}
				else
					break;
			}
#else
			
			ioctlsocket(m_hSocket,FIONREAD,(unsigned long *)&dRevLen);
			if(dRevLen>=sizeof(Smpp_MESSAGE_HEAD))
			{
				memset(buffer,0,MAX_SMPP_COM_BUF);
				dRevLen=fReceive(buffer,sizeof(MAX_SMPP_COM_BUF));
//				if(send_sequence==phead->sequence_no && phead->command_id==ESME_SUB_SM_RESP)
				if(send_sequence==phead->sequence_no &&phead->command_id==ESME_SUB_SM_RESP)
				{
					if(phead->command_status==E_SUCCESS)
					{
						Smpp_PRINTOUT((CString)destaddr + "  Submit +OK.\n");
						return 1;
					}
					else
					{
						Smpp_PRINTOUT("FAILED: Submit.\n");
//						fLogout(FALSE);
//						fDisconnect();
//						return -2; 
					}
					return phead->command_status;
				}
			}
			
#endif
		}
	}	
	else if(result<0)
	{
//		Sleep(50);
//		if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
//		if(time(NULL)-starttime>MAX_SUBTIME)    //5--10s  
		{
			Smpp_PRINTOUT("FAILED: SendSM receive timeout");	
			fLogout(FALSE);
			fDisconnect();
			Sleep(3000);
//			return -4;		
		}
	}
	FD_CLR(m_hSocket,&sockset);
//	return 1;
	return -4;

}
int CSmppSock::fill_wap_message(BYTE* pbody,const char* msg,const char* http)
{
/*	以下内容为转贴,呵呵,两个朋友的放到一起来分析,呵呵

0605040B840000      \\udh
01060201AE             \\pud
\\body
02056A0045C6   0C03   
3231382E35372E382E35322F514C52582F41444D494E2F435448582F644F574E2E6578653F616374696F6E3D444F574E69617468656E7A696F6165797A71772C3033  
000AC307    20040314175933 
10C307        20040315175933
0103
E6809DE6B283E5BDA9E59BBEE5928CE5BCA6000101
*/
	BYTE *p=pbody+1;
	//udh
    *p++ = 0x06; //User Data Header Length (6 bytes)
    *p++ = 0x05; //*p++ Item Element id (Port Numbers)
    *p++ = 0x04; //*p++ IE length (4 bytes)
    *p++ = 0x0B;
    *p++ = 0x84; //destination port number
    *p++ = 0x00;
    *p++ = 0x00; //origin port number
     //pud
	*p++ = 0x01; //transaction id (connectionless WSP)
    *p++ = 0x06; //'pdu type (06=push)
    *p++ = 0x06; //Headers len
    *p++ = 0x03;
    *p++ = 0xAE;
    *p++ = 0x81;
    *p++ = 0xEA; //content type: application/vnd.wap.sic; charset=utf-8
    *p++ = 0x8D; //content-length
	BYTE *tp=p++;
//    *p++ = Integer.toHexString(length).toUpperCase();
     //body
    *p++ = 0x02;
    *p++ = 0x05; //-//WAPFORUM//DTD SI 1.0//EN
    *p++ = 0x6A; //UTF-8
    *p++ = 0x00; //字符串结束
    *p++ = 0x45; //<si>
    *p++ = 0xC6; //<indication
    *p++ = 0x08; //<action=signal-high>
    *p++ = 0x0C; //href=0xhttp://
    *p++ = 0x03; //字符串开始
	strcpy((char*)p,http);//http://
	p+=strlen(http);
    *p++ = 0x00; //字符串结束
    *p++ = 0x0A; //created=
    *p++ = 0xC3; //'时间
    *p++ = 0x07; //时间字节数
    *p++ = 0x20;*p++ = 0x04;*p++ = 0x11;*p++ = 0x26;
	*p++ = 0x15;*p++ = 0x20;*p++ = 0x20; //YYYYMMDDHHMMSS
    *p++ = 0x10; //si_expires=
    *p++ = 0xC3; //时间
    *p++ = 0x07; //时间字节数
    *p++ = 0x20;*p++ = 0x04;*p++ = 0x11;*p++ = 0x27;
	*p++ = 0x15;*p++ = 0x20;*p++ = 0x20; //YYYYMMDDHHMMSS
    *p++ = 0x01; //>
    *p++ = 0x03; //字符串开始

	CString pOut="";
 	CChineseCodeLib::GB2312ToUTF_8(pOut,msg,strlen(msg));

	strcpy((char*)p,pOut.GetBuffer(0));
	p+=strlen(pOut); //显示给用户的内容,用utf-8编码。utf-8编码,英文字符直接用ascii码;中文如果unicode是(二进制)
// 	strcpy((char*)p,msg);
//	p+=strlen(msg); //显示给用户的内容,用utf-8编码。utf-8编码,英文字符直接用ascii码;中文如果unicode是(二进制)
    *p++ = 0x00; //字符串结束
    *p++ = 0x01; //</indication>0x
    *p++ = 0x01; //'</si>

	*tp=p-tp-1;

	int len=p-pbody;
	*pbody=len-1;
	return len;
}

int CSmppSock::fReadAndAtuoAnswer()
{
	if(!m_bConnected) {Smpp_PRINTOUT("FAILED: have not connected."); return 0;}
	if(!m_bAlive){Smpp_PRINTOUT("FAILED: have not login."); return 0;}
	BYTE buffer[MAX_SMPP_COM_BUF];
	struct Smpp_MESSAGE_HEAD *phead=(struct Smpp_MESSAGE_HEAD *)buffer;

	DWORD dRevLen;
	for(int i=0;i<10;i++)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
		if(dRevLen<sizeof(Smpp_MESSAGE_HEAD))break;

		if(dRevLen>=sizeof(Smpp_MESSAGE_HEAD))
		{
			memset(buffer,0,sizeof(Smpp_MESSAGE_HEAD));
			dRevLen=fReceive(buffer,sizeof(Smpp_MESSAGE_HEAD));
			if(phead->command_id==ESME_QRYLINK)
			{
				phead->command_id=network_dword(ESME_QRYLINK_RESP);
				phead->sequence_no=network_dword(phead->sequence_no);
				phead->command_length=network_dword(sizeof(Smpp_MESSAGE_HEAD)); 
				phead->command_status=0;
				send(m_hSocket,(const char*)buffer,sizeof(Smpp_MESSAGE_HEAD),0);
				//PRINTOUT("send alive test rep\r\n");
			}
			else if(phead->command_id==ESME_SUB_SM_RESP)// && send_sequence==phead->sequence_no)
			{
				//PRINTOUT("Submit_rep\r\n");
				return -2; 
			}
		}
	}	
	return -4;
}

void CSmppSock::Check()
{
	fReadAndAtuoAnswer();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -