📄 smppsock.cpp
字号:
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 + -