📄 smppsockold.cpp
字号:
//Send(&head,packet_len);
if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
{
Smpp_PRINTOUT("FAILED: send packet failed.");
return -0xff;
}
Sleep(100);
if(!bResp) return 1;
//receive
DWORD dRevLen;
UINT starttime=time(NULL);
//MSG msg;
while(1)//GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg); DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen);
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(Smpp_MESSAGE_HEAD))
{
memset(&head,0,sizeof(Smpp_MESSAGE_HEAD));
dRevLen=fReceive((BYTE*)&head,sizeof(MAX_SMPP_COM_BUF));
if(logout_sequence==head.sequence_no && head.command_id==ESME_UBD_RESP)
{
if(head.command_status==E_SUCCESS)
{
m_bAlive=FALSE; Smpp_PRINTOUT("Logout +OK.");
return 1;
}
else
{
Smpp_PRINTOUT("FAILED: Logout ");
return -5;
}
}
}
Sleep(100);
// if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
if(time(NULL)-starttime>MAX_LOGOUTTIME) //5--10s
{
Smpp_PRINTOUT("FAILED: Logout,receive timeout");
return -4;
}
}
return -4;
}
/*********************************************************************************
return
/*********************************************************************************/
int CSmppSock::fAliveTst()
{
Smpp_PRINTOUT("Alive test.....") ;
if(!m_bConnected) {Smpp_PRINTOUT("FAILED: have not connected."); return 0;}
Smpp_MESSAGE_HEAD head;
UINT packet_len=sizeof(Smpp_MESSAGE_HEAD);
head.command_length=packet_len;
head.command_id=ESME_QRYLINK;
head.command_status=0;
head.sequence_no=m_sequence++;
UINT querylink_sequence=head.sequence_no;
network_head(&head);
//Send(&head,packet_len);
if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
{
Smpp_PRINTOUT("FAILED: send packet failed.");
return -0xff;
}
Sleep(100);
//receive
DWORD dRevLen;
UINT starttime=time(NULL);
//MSG msg;
while(1)// GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg);
//DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen);
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(Smpp_MESSAGE_HEAD))
{
memset(&head,0,sizeof(Smpp_MESSAGE_HEAD));
dRevLen=fReceive((BYTE*)&head,sizeof(MAX_SMPP_COM_BUF));
if(querylink_sequence==head.sequence_no && head.command_id==ESME_QRYLINK_RESP)
{
if(head.command_status==E_SUCCESS)
{
m_bAlive=TRUE; Smpp_PRINTOUT("Alivet test +OK.");
return 1;
}
else
{
m_bAlive=FALSE;
Smpp_PRINTOUT("FAILED: Alive test.");
return -5;
}
}
}
Sleep(100);
// if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
if(time(NULL)-starttime>MAX_ALIVETESTTIME) //5--10s
{
Smpp_PRINTOUT("FAILED: Alive test receive timeout");
//fDisconnect();
return -4;
}
}
return m_bAlive;
}
/*******************************************************************************
return
-1:host or port is unexpect
-2:create error
-3:connect failed
1:success connect
/*******************************************************************************/
int CSmppSock::fConnect(char *host, unsigned int port)
{
int ret=1;
if( (!host)||(port<1) )
{
Smpp_PRINTOUT("FAILED: host or port is unexpect.");
return -1;
}
strcpy(m_smscInfo.SMSCIP,host);
m_smscInfo.uPort=port;
char degTemp[100];
sprintf(degTemp,"connecting to %s...",host);
Smpp_PRINTOUT(degTemp);
if(m_bAlive) fLogout(FALSE);
if(m_bConnected)
{
fDisconnect(); Sleep(1000);
}
if(m_hSocket==INVALID_SOCKET)
{
if(CreateSocket()==0) return -2;
}
m_sequence=0;
m_bConnected=m_bAlive=FALSE;
m_smscInfo.uPort=port;
strcpy(m_smscInfo.SMSCIP,host);
SOCKADDR_IN sockaddr_inServer;
memset(&sockaddr_inServer,0,sizeof(SOCKADDR_IN));
sockaddr_inServer.sin_family=AF_INET;
sockaddr_inServer.sin_addr.s_addr=inet_addr(host);
sockaddr_inServer.sin_port=htons(port);
if(connect(m_hSocket,(SOCKADDR *)&sockaddr_inServer,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
Smpp_PRINTOUT("FAILED: connect failed!");
int nErrorCode_=WSAGetLastError();
//ShowTcpErr(nErrorCode_);
//out("Error:connect()\n");
return(-3);
}
m_smscInfo.uPort=port; strcpy(m_smscInfo.SMSCIP,host);
Smpp_PRINTOUT("connect +OK.");
/* set socket to non-blocking */
u_long temp=1;
if (ioctlsocket(m_hSocket,FIONBIO,&temp) == SOCKET_ERROR)
{
return WSAGetLastError();
// perror("Notice:ioctlsocket(non-block)\n");
}
/* set socket to SO_LINGER */
LINGER optval;
optval.l_onoff=1;
optval.l_linger=0; //abort
if(setsockopt(m_hSocket, SOL_SOCKET,SO_LINGER,(char *)&optval, sizeof(LINGER)) == SOCKET_ERROR)
{
return WSAGetLastError();
}
//keepalive = yes
int bkeep=true;
if(setsockopt(m_hSocket, SOL_SOCKET,SO_KEEPALIVE,(char *)&bkeep, sizeof(int)) == SOCKET_ERROR)
{
return WSAGetLastError();
}
m_bConnected=TRUE;
return 1;
}
/*******************************************************************************
return ;
/*******************************************************************************/
int CSmppSock::fDisconnect()
{
if(m_bConnected)
{
closesocket(m_hSocket);
m_hSocket=INVALID_SOCKET;
m_bConnected=FALSE;
m_bAlive=FALSE;
Smpp_PRINTOUT("FAILED: socket连接已断开. ");
}
return 1;
}
int CSmppSock::fReceive(BYTE* lpBuf, int nBufLen)
{
int iRet=0;
int nLen;
nLen=sizeof(Smpp_MESSAGE_HEAD);
struct Smpp_MESSAGE_HEAD *phead=(struct Smpp_MESSAGE_HEAD *)lpBuf;
//if(Receive(lpBuf,nLen)!=nLen)
if(recv(m_hSocket,(char*)lpBuf,nLen,MSG_PEEK)!=nLen)
{
//fGetSockErr(degTemp); Smpp_PRINTOUT(degTemp) ;
Smpp_PRINTOUT("FAILED: Receive -FAILED");
return -1;
}
network_head(phead);
lpBuf+=nLen;
nLen=phead->command_length-sizeof(Smpp_MESSAGE_HEAD);
if(nLen>1000) nLen=0; //added for assert
if(nLen>0)
{
//if(Receive(lpBuf,nLen)!=nLen)
if(recv(m_hSocket,(char*)lpBuf,nLen,0)!=nLen)
{
//fGetSockErr(degTemp); Smpp_PRINTOUT(degTemp) ;
Smpp_PRINTOUT("FAILED: Receive -FAILED");
return -1;
}
}
return nLen+sizeof(Smpp_MESSAGE_HEAD);
}
/*int CSmppSock::fCodeMsg(BYTE *msg,int& nMsglen)
{
int i=0,j=0,iRet=0;
while(i++<nMsglen)
{
if((int)msg[i-1]>0x7f)
{ iRet=8; break;}
if((int)msg[i-1]=='_')
{ iRet=8;break;}
}
if(iRet==8)
{
BYTE* lbTemp=msg;
WCHAR wTemp[MAX_MSGLEN/2]; memset((BYTE*)wTemp,0,MAX_MSGLEN);
nMsglen=MultiByteToWideChar(CP_ACP,0,(char*)lbTemp, -1,wTemp,int(MAX_SENDBUF/2));
if(nMsglen>0)
{
for(i=0;i<nMsglen-1;i++)
{
char cTemp[5]="\0";
int xxx=*((WORD*)(wTemp+i));
itoa(xxx,cTemp,16);
if((cTemp[3]==0)&&(cTemp[2])==0)
{
cTemp[3]=cTemp[1];cTemp[2]=cTemp[0];
cTemp[1]=0;cTemp[0]=0;
}
if(cTemp[3]==0) cTemp[3]=48;
if(cTemp[2]==0) cTemp[2]=48;
if(cTemp[1]==0) cTemp[1]=48;
if(cTemp[0]==0) cTemp[0]=48;
memcpy(lbTemp,cTemp,4);
lbTemp+=4;
}
nMsglen=lbTemp-msg;
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -