📄 smppsock.cpp
字号:
// SMPP Sock.cpp : implementation file
#include "stdafx.h"
#include "SmppSock.h"
#include "mbstring.h"
#include "Global.h"
#include "ChineseCodeLib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern struct _tagSMEConfig SMEConfig;
int fGetSockErr(char errText[MAX_ERRTEXT])
{
ASSERT(errText!=NULL);
strcpy(errText,"\0");
int iRet=WSAGetLastError();
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,iRet,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL);
sprintf(errText,"SOCKET错误:%s",(LPCSTR)lpMsgBuf); //errText[strlen(errText)-2]=0;
LocalFree(lpMsgBuf );
return iRet;
}
void CSmppSock::network_head(struct Smpp_MESSAGE_HEAD* phead)
{
phead->command_length=network_dword(phead->command_length);
phead->command_id=network_dword(phead->command_id);
phead->command_status=network_dword(phead->command_status);
phead->sequence_no=network_dword(phead->sequence_no);
}
int CSmppSock::fill_message(BYTE* pbody,const char* msg)
{
BYTE *p=pbody;
BYTE len=strlen(msg);
if(len>420) len=420;
wchar_t bb[1000]; memset(bb,0,sizeof(bb));
MultiByteToWideChar(CP_ACP,0,(const char*)msg,len,bb,sizeof(bb));
len=wcslen(bb)*2;
int total_len=len+1;
if(len>140)
{
*p++=0; //0
*p++=0x04;*p++=0x24;//message_payload 0x0424 Generic
*p++=len/256;*p++=len%256; //len
total_len=len+5;
}
else
{
*p++=len; //sm_length
}
memcpy(p,bb,len);
BYTE temp;
for(int i=0;i<len/2;i++)
{
temp=p[i*2];p[i*2]=p[i*2+1];p[i*2+1]=temp;
}
return total_len;
/*BYTE *p=pbody;
BSTR bb=msg.AllocSysString();
BYTE len=wcslen(bb)*2;
if(len>200) len=200;
*p++=len; //sm_length
memcpy(p,bb,len);
::SysFreeString(bb);
BYTE temp;
for(int i=0;i<len/2;i++)
{
temp=p[i*2];p[i*2]=p[i*2+1];p[i*2+1]=temp;
}
return len+1;*/
}
/////////////////////////////////////////////////////////////////////////////
CSmppSock::CSmppSock()
{
reference_seq=0;
bFlash=FALSE;
nReceiveError=0;
m_msg_len=132;
m_sequence=1;
//m_defaultPeroid=10;
m_bConnected=m_bAlive=FALSE;
strcpy(m_smscInfo.SMSCIP,"10.71.13.17"); //hz add
m_smscInfo.uPort=5018; //hz add
strcpy(m_smscInfo.usrName,"roam"); //hz add
strcpy(m_smscInfo.passWd,"8888"); //hz add
/* strcpy(m_smscInfo.SMSCIP,SMEConfig.host);
m_smscInfo.uPort=SMEConfig.port;
strcpy(m_smscInfo.usrName,SMEConfig.user);
strcpy(m_smscInfo.passWd,SMEConfig.pwd);
// strcpy(SMEConfig.province,pApp->GetProfileString("SME","province"));
// strcpy(SMEConfig.src_addr,pApp->GetProfileString("SME","src_addr"));
*/
m_hSocket=INVALID_SOCKET;
// m_hEventMainOver=CreateEvent(NULL,TRUE,FALSE,"exit"); //nosignle
}
int CSmppSock::CreateSocket()
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
if(m_hSocket==INVALID_SOCKET)
{
Smpp_PRINTOUT("FAILED:socket create failed.....");
//nErrorCode_=WSAGetLastError();
return 0;
}
SOCKADDR_IN sockaddr;
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family=AF_INET;
sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
sockaddr.sin_port=htons(0);
if(bind(m_hSocket,(LPSOCKADDR)&sockaddr,sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(m_hSocket);
Smpp_PRINTOUT("FAILED:socket bind failed,close socket.....");
//int nErrorCode_=WSAGetLastError();
m_hSocket=INVALID_SOCKET;
return 0;
}
m_sequence=1;
return 1;
}
CSmppSock::~CSmppSock()
{
fLogout();
fDisconnect();
// if(m_hEventMainOver) CloseHandle(m_hEventMainOver);
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSmppSock, CSocket)
//{{AFX_MSG_MAP(CSmppSock)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CSmppSock member functions
/**************************************************************************************
return
0 : already have login
-1: usrname is null
-2: no socket connected
-4: receive response timeout
-5: login be rejected
>0: success
**************************************************************************************/
int CSmppSock::fLogin(char *usrname, char *passwd)
{
ClearBuffer();
if(m_bAlive) {Smpp_PRINTOUT("已登录."); return 0;}
if(!m_bConnected){Smpp_PRINTOUT("FAILED:socket连接尚未建立."); return -2;}
if(!usrname) {Smpp_PRINTOUT("FAILED:用户名为空.") ; return -1;}
strcpy(m_smscInfo.usrName,usrname);
strcpy(m_smscInfo.passWd,passwd);
Smpp_PRINTOUT("Logining.....");
BYTE buffer[MAX_SMPP_COM_BUF];
memset(buffer,0,MAX_SMPP_COM_BUF);
struct Smpp_MESSAGE_HEAD *phead=(struct Smpp_MESSAGE_HEAD *)buffer;
BYTE *p=buffer+sizeof(struct Smpp_MESSAGE_HEAD);
strcpy((char*)p,usrname); p+=strlen(usrname)+1; //pbind->system_id
strcpy((char*)p,passwd); p+=strlen(passwd)+1; //pbind->password
*p++=0; //pbind->system_type
*p++=0x34; //pbind->interface_version=1;
*p++=0; //pbind->addr_ton=0;
*p++=0; //pbind->addr_npi=0;
*p++=0; //pbind->address_range
phead->command_id=ESME_BNDTRN;
phead->command_status=0;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
phead->sequence_no=m_sequence++;
UINT login_sequence=phead->sequence_no;
network_head(phead);
//if(Send(buffer,packet_len)==SOCKET_ERROR)
if(Send(buffer,packet_len)==SOCKET_ERROR)
{
if(Send(buffer,packet_len)==SOCKET_ERROR)//重发
{
Smpp_PRINTOUT("FAILED:Login ,send packet failed.Disconnect...");
fDisconnect();
return -0xff;
}
}
Sleep(1000);
//receive resp
int dRevLen;
UINT starttime=time(NULL);
//MSG msg;
while(1) //GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg); DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen); //get the socket on receive data length
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(login_sequence==phead->sequence_no && phead->command_id==ESME_BNDTRN_RESP)
{
if(((Smpp_MESSAGE_HEAD*)buffer)->command_status==E_SUCCESS)
{
m_bAlive=TRUE; Smpp_PRINTOUT("Login +OK.");
nReceiveError=0;
return 1;
}
else
{
Smpp_PRINTOUT("FAILED: Login +FAILED.");
return -5;
}
}
}
Sleep(100);
if(time(NULL)-starttime>MAX_LOGINTIME) //5--10s
{
Smpp_PRINTOUT("FAILED:LOGIN receive timeout");
fDisconnect();
return -4;
}
}
return -4;
}
/*****************************************************************************************
return
0 : no login or socket connect
-1: destadd or sendmsg is null
-2: sendmsg error
-3: sendpack error
-4: receive response timeout
-5:
-6: sendsm resperror
1: success
0xff : no send sm alarm
*****************************************************************************************/
//#define m_msg_len 132
//#define m_msg_len 140
int CSmppSock::fSendSM2(const char* destaddr,const char* srcaddr, const char* sendmsg,bool bResp)
{
//Smpp_PRINTOUT((CString)destaddr + " Submit +OK.\n");
//return 1;
if(!m_bConnected)
{
return 0xFF;
}
if(!m_bAlive)
{
if(fLogin(m_smscInfo.usrName,m_smscInfo.passWd)<1)
{
Smpp_PRINTOUT("FAILED: Submit , login retrying");
fDisconnect();
Sleep(3000);
return -2;
}
}
if(destaddr[0]==0 || sendmsg[0]==0 )
{
Smpp_PRINTOUT("FAILED: Submit , destadd or sendmsg is NULL") ;
return -1;
}
int len=strlen(sendmsg);
if(len>420) len=420;
// CString pOut="";
// CChineseCodeLib::GB2312ToUTF_8(pOut,sendmsg,strlen(sendmsg));
wchar_t bb[1000]; memset(bb,0,sizeof(bb));
BYTE *pbb=(BYTE *)bb;
MultiByteToWideChar(CP_ACP,0,(const char*)sendmsg,len,bb,sizeof(bb));
len=wcslen(bb)*2;
// len=pOut.GetLength();
// strcpy((char*)pbb,pOut.GetBuffer(0));
int total_msg_len=len;
BYTE temp;
int i;
for(i=0;i<len/2;i++)
{
temp=pbb[i*2];pbb[i*2]=pbb[i*2+1];pbb[i*2+1]=temp;
}
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;
strcpy((char*)p,srcaddr); p+=strlen(srcaddr)+1; //source_address
*p++=1; //pbody->dest_address_ton=1;
*p++=1; //pbody->dest_address_npi=1;
strcpy((char*)p,destaddr); p+=strlen(destaddr)+1; //dest_address
*p++=0; //pbody->esm_class=64=0x40
//*p++=0; //pbody->esm_class=0;
*p++=0; //pbody->protocol_ID=0;
*p++=0; //pbody->priority_flag=0;
*p++=0; //schedule_delivery_time
if(m_life.bUsed==1)///生存期限
p+=FillTimeStrToStr((char *)p);
else
*p++=0; //validity_peroid
*p++=0; //registered_delivery_flag
*p++=0; //replace_if_presend_flag
if(m_bFlashMsg==1)
*p++=24; //快闪短信
else
*p++=8; //data_codeing
*p++=0; //sme_default_msgid
UINT send_sequence=0;
BYTE* pmsg=p;
BYTE mlen=0;
WORD sar_msg_ref_num=0xde;
BYTE sar_total_segments=len/134+((len%134>0)?1:0);
BYTE sar_segment_seqnum=1;
while(len>0)
{
p=pmsg;
if(total_msg_len>140)//还有 more_messages_to_send 0x0426 GSM
{
mlen=m_msg_len;
if(len<m_msg_len)
{
mlen=len;
}
*p++=mlen;
memcpy(p,pbb,mlen);
pbb+=mlen;
p+=mlen;
*p++=0x02;*p++=0x0c;
*p++=0;*p++=2;
*p++=0;
*p++=sar_msg_ref_num;
*p++=0x02;*p++=0x0e;
*p++=0;*p++=1;
*p++=sar_total_segments;
*p++=0x02;*p++=0x0f;
*p++=0;*p++=1;
*p++=sar_segment_seqnum++;
/*
sar_msg_ref_num 0x020C Generic
sar_total_segments 0x020E Generic
sar_segment_seqnum 0x020F Generic */
}
else
{
mlen=len;
*p++=mlen;
memcpy(p,pbb,mlen);
pbb+=mlen;
p+=mlen;
}
len-=mlen;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
phead->sequence_no=m_sequence++;
send_sequence=phead->sequence_no;
phead->command_id=ESME_SUB_SM;
phead->command_status=0;
network_head(phead);
//if(Send(buffer,packet_len)==SOCKET_ERROR)
if(Send(buffer,packet_len)==SOCKET_ERROR)
{
if(Send(buffer,packet_len)==SOCKET_ERROR)//重发
{
Smpp_PRINTOUT("FAILED: Send Short Message ,send packet failed.disconnect...\r\n");
//fDisconnect();
return -0xff;
}
}
}
return 1;
}
int CSmppSock::fSendSM(const char* destaddr,const char* srcaddr, const char* sendmsg,bool bResp)
{
//Smpp_PRINTOUT((CString)destaddr + " Submit +OK.\n");
//return 1;
/*
if(!m_bConnected)
{
return 0xFF;
}
if(!m_bAlive)
{
if(fLogin(m_smscInfo.usrName,m_smscInfo.passWd)<1)
{
Smpp_PRINTOUT("FAILED: Submit , login retrying");
fDisconnect();
Sleep(3000);
return -2;
}
}*/
if(destaddr[0]==0 || sendmsg[0]==0 )
{
Smpp_PRINTOUT("FAILED: Submit , destadd or sendmsg is NULL") ;
return -1;
}
int len=strlen(sendmsg);
if(len>420) len=420;
// CString pOut="";
// CChineseCodeLib::GB2312ToUTF_8(pOut,sendmsg,strlen(sendmsg));
wchar_t bb[1000]; memset(bb,0,sizeof(bb));
BYTE *pbb=(BYTE *)bb;
MultiByteToWideChar(CP_ACP,0,(const char*)sendmsg,len,bb,sizeof(bb));
len=wcslen(bb)*2;
// len=pOut.GetLength();
// strcpy((char*)pbb,pOut.GetBuffer(0));
int total_msg_len=len;
BYTE temp;
int i;
for(i=0;i<len/2;i++)
{
temp=pbb[i*2];pbb[i*2]=pbb[i*2+1];pbb[i*2+1]=temp;
}
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;
strcpy((char*)p,srcaddr); p+=strlen(srcaddr)+1; //source_address
*p++=1; //pbody->dest_address_ton=1;
*p++=1; //pbody->dest_address_npi=1;
strcpy((char*)p,destaddr); p+=strlen(destaddr)+1; //dest_address
if(total_msg_len>140)
{
*p++=0x40; //pbody->esm_class=64=0x40
}
else
{
*p++=0; //pbody->esm_class=64=0x40
}
//*p++=0; //pbody->esm_class=0;
*p++=0; //pbody->protocol_ID=0;
*p++=0; //pbody->priority_flag=0;
*p++=0; //schedule_delivery_time
if(m_life.bUsed==1)///生存期限
p+=FillTimeStrToStr((char *)p);
else
*p++=0; //validity_peroid
*p++=0; //registered_delivery_flag
*p++=0; //replace_if_presend_flag
if(m_bFlashMsg==1)
*p++=24; //快闪短信
else
*p++=8; //data_codeing
*p++=0; //sme_default_msgid
UINT send_sequence=0;
BYTE* pmsg=p;
BYTE mlen=0;
WORD sar_msg_ref_num=1;
BYTE sar_total_segments=len/MAX_SMS_MSG_LEN+((len%MAX_SMS_MSG_LEN>0)?1:0);
BYTE sar_segment_seqnum=1;
reference_seq++;
while(len>0)
{
p=pmsg;
if(total_msg_len>140)//还有 more_messages_to_send 0x0426 GSM
{
mlen=MAX_SMS_MSG_LEN;
*p++=mlen+6;//UDL
*p++=5;//UDHL Length of User Data Header
*p++=0;//IEIa Information-Element-Identifier "A"
*p++=0x03;//IEIDLa Length of Information-Element "A"
*p++=reference_seq;//Concatenated short message reference number
*p++=sar_total_segments;//Maximum number of short messages in the concatenated short message.
*p++=sar_segment_seqnum++;//Sequence number of the current short message.
memcpy(p,pbb,mlen);
pbb+=mlen;
p+=mlen;
}
else
{
mlen=len;
*p++=mlen;
memcpy(p,pbb,mlen);
pbb+=mlen;
p+=mlen;
}
len-=mlen;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
phead->sequence_no=m_sequence++;
send_sequence=phead->sequence_no;
phead->command_id=ESME_SUB_SM;
phead->command_status=0;
network_head(phead);
//if(Send(buffer,packet_len)==SOCKET_ERROR)
if(Send(buffer,packet_len)==SOCKET_ERROR)
{
if(Send(buffer,packet_len)==SOCKET_ERROR)//重发
{
Smpp_PRINTOUT("FAILED: Send Short Message ,send packet failed.disconnect...\r\n");
//fDisconnect();
return -0xff;
}
}
}
// Sleep(50);
if(!bResp) return 1;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -