📄 smppsock3.cpp
字号:
// SMPP Sock.cpp : implementation file
#include "stdafx.h"
#include "SmppSock.h"
#include "mbstring.h"
#include "sme.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void CSmppSock::network_head(struct 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>300) len=100;
wchar_t bb[300]; memset(bb,0,sizeof(bb));
MultiByteToWideChar(CP_ACP,0,(const char*)msg,len,bb,sizeof(bb));
len=wcslen(bb)*2;
*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 len+1;
}
/////////////////////////////////////////////////////////////////////////////
CSmppSock::CSmppSock()
{
m_sequence=1;
m_bConnected=m_bAlive=FALSE;
strcpy(SMEConfig.smc_ip,"10.238.30.11");
SMEConfig.smc_port=5016;
strcpy(SMEConfig.smc_user,"hc");
strcpy(SMEConfig.smc_pwd,"");
m_hSocket=INVALID_SOCKET;
}
int CSmppSock::CreateSocket()
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
if(m_hSocket==INVALID_SOCKET)
{
printf("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);
printf("FAILED:socket bind failed,close socket.....");
//int nErrorCode_=WSAGetLastError();
m_hSocket=INVALID_SOCKET;
return 0;
}
m_sequence=1;
return 1;
}
CSmppSock::~CSmppSock()
{
fDisconnect();
}
// 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)
{
if(m_bAlive) {printf("已登录."); return 0;}
if(!m_bConnected){printf("FAILED:socket连接尚未建立."); return -2;}
if(!usrname) {printf("FAILED:用户名为空.") ; return -1;}
strcpy(SMEConfig.smc_user,usrname);
strcpy(SMEConfig.smc_pwd,passwd);
puts("Logining.....");
BYTE buffer[MAX_SMPP_COM_BUF];
memset(buffer,0,MAX_SMPP_COM_BUF);
struct MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)buffer;
BYTE *p=buffer+sizeof(struct 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++=3; //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(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
{
puts("FAILED:Login ,send packet failed.Disconnect...");
fDisconnect();
return -0xff;
}
}
Sleep(100);
//receive resp
DWORD dRevLen;
UINT starttime=time(NULL);
while(1)
{
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(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(((MESSAGE_HEAD*)buffer)->command_status==E_SUCCESS)
{
m_bAlive=TRUE; puts("Login +OK.");
return 1;
}
else
{
puts("FAILED: Login +FAILED.");
return -5;
}
}
}
Sleep(100);
if(bEventMainOver) break;
if(time(NULL)-starttime>MAX_LOGINTIME) //5--10s
{
puts("FAILED:LOGIN receive timeout");
fDisconnect();
return -4;
}
}
return -4;
}
/*****************************************************************************************
return
-1: destadd or sendmsg is null
-2: submit sm ,but failed
-3: sendpack error
-4: receive response timeout
-5: connect failed
-6: login failed.
1: success
0xff : no send sm alarm
*****************************************************************************************/
int CSmppSock::fSendSM(char* destaddr,char* sendmsg,char* srcaddr,BOOL bResp)
{
//printf(destaddr); printf(" Submit +OK.\n");
//return 1;
if(!m_bConnected)
{
if(fConnect(SMEConfig.smc_ip,SMEConfig.smc_port)<1)
{
puts("FAILED:Submit , connect retrying");
return -5;
}
}
if(!m_bAlive)
{
// strcpy(SMEConfig.smc_user,"name");strcpy(SMEConfig.smc_pwd,"pass");
if(fLogin(SMEConfig.smc_user,SMEConfig.smc_pwd)<1)
{
puts("FAILED: Submit , login retrying");
fDisconnect();
Sleep(3000);
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 MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)buffer;
BYTE* p=buffer+sizeof(struct 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=0;
*p++=0; //pbody->protocol_ID=0;
*p++=3; //pbody->priority_flag=0;
*p++=0; //schedule_delivery_time
*p++=0; //validity_peroid
*p++=0; //registered_delivery_flag
*p++=0; //replace_if_presend_flag
*p++=8; //data_codeing
*p++=0; //sme_default_msgid
p+=fill_message(p,sendmsg); //length and content
*/
//******************和短信中心接口*************************/
/*************************和前置机接口***********************/
strcpy((char*)p,destaddr); p+=20;
strcpy((char*)p,"0002");p+=4;
strcpy((char*)p,srcaddr); p+=10;
*p++=strlen(sendmsg);
strcpy((char*)p,sendmsg);
p+=strlen(sendmsg);
/***********************************************************/
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);
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
{
puts("FAILED: Send Short Message ,send packet failed.disconnect...");
fDisconnect();
return -3;
}
}
Sleep(50);
if(!bResp) return 1;
DWORD dRevLen;
UINT starttime=time(NULL);
while(1)
{
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(MESSAGE_HEAD))
{
memset(buffer,0,MAX_SMPP_COM_BUF);
dRevLen=fReceive(buffer,sizeof(MAX_SMPP_COM_BUF));
//printf("%d and send resp %d\n",send_sequence,phead->sequence_no);
if(phead->command_id==ESME_QRYLINK)
{
phead->command_id=ESME_QRYLINK_RESP;
phead->command_status=0;
packet_len=sizeof(MESSAGE_HEAD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -