📄 cmppsock.cpp
字号:
// CMPP Sock.cpp : implementation file
//2001-10-20:hEventMainOver修改成bEventMainOver,直接BOOL控制,不用随时Waitfor
#include "stdafx.h"
#include "CmppSock.h"
#include "mbstring.h"
#include "global.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern BOOL bEventMainOver;
void CCmppSock::network_head(struct MESSAGE_HEAD* phead)
{
phead->command_length=network_dword(phead->command_length);
phead->command_id=network_dword(phead->command_id);
phead->sequence_no=network_dword(phead->sequence_no);
}
int CCmppSock::fill_message(BYTE* pbody,const char* msg)
{
BYTE *p=pbody;
BYTE len=strlen(msg);
if(len>200) len=200;
wchar_t bb[500]; 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;
}
/////////////////////////////////////////////////////////////////////////////
CCmppSock::CCmppSock()
{
m_sequence=m_msgid=1;
m_bConnected=m_bAlive=FALSE;
strcpy(m_smscInfo.SMSCIP,"211.137.79.246");
m_smscInfo.uPort=7890;
strcpy(m_smscInfo.usrName,"917201"); //SP_ID
strcpy(m_smscInfo.passWd,""); //authentication SP
m_hSocket=INVALID_SOCKET;
}
int CCmppSock::CreateSocket()
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
if(m_hSocket==INVALID_SOCKET)
{
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);
PRINTOUT("FAILED:socket bind failed,close socket.....");
//int nErrorCode_=WSAGetLastError();
m_hSocket=INVALID_SOCKET;
return 0;
}
m_sequence=0;
return 1;
}
CCmppSock::~CCmppSock()
{
fDisconnect();
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CCmppSock, CSocket)
//{{AFX_MSG_MAP(CCmppSock)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
//char Cmpp::ST_connect_rep_status[][];
//char Cmpp::ST_submit_rep_result[][];
//char Cmpp::ST_command_id[][];
/////////////////////////////////////////////////////////////////////////////
// CCmppSock 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 CCmppSock::fLogin(char *usrname, char *passwd)
{
if(m_bAlive) {PRINTOUT("已登录."); return 0;}
if(!m_bConnected){PRINTOUT("FAILED:socket连接尚未建立."); return -2;}
if(!usrname) {PRINTOUT("FAILED:用户名为空.") ; return -1;}
strcpy(m_smscInfo.usrName,usrname);
strcpy(m_smscInfo.passWd,passwd);
PRINTOUT("Logining.....");
BYTE buffer[MAX_CMPP_COM_BUF];
memset(buffer,0,MAX_CMPP_COM_BUF);
struct MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)buffer;
BYTE* p=buffer+sizeof(struct MESSAGE_HEAD);
strcpy((char*)p,usrname); p+=6; //sp_id
int passlen=strlen(passwd);
//926150801
CTime stime=CTime::GetCurrentTime();
char strt[11];
sprintf(strt,"%02d%02d%02d%02d%02d",stime.GetMonth(),stime.GetDay(),
stime.GetHour(),stime.GetMinute(),stime.GetSecond());
UINT Timestamp=atoi(strt);
char strmdbuf[50];
memset(strmdbuf,0,sizeof(strmdbuf));
strcpy(strmdbuf,usrname);
strcpy(strmdbuf+15,passwd);
strcpy(strmdbuf+15+passlen,strt);
md5.MD5Update((BYTE*)strmdbuf,15+passlen+10);
md5.MD5Final((BYTE*)strmdbuf);
memcpy((char*)p,strmdbuf,16); p+=16; //authen SP
*p++=0x30; //version
*p++=*((BYTE*)&Timestamp+3);
*p++=*((BYTE*)&Timestamp+2);
*p++=*((BYTE*)&Timestamp+1);
*p++=*((BYTE*)&Timestamp);
UINT packet_len=p-buffer;
UINT login_sequence=m_sequence++;
phead->command_length=network_dword(packet_len);
phead->command_id=network_dword(CMPP_CONNECT);
phead->sequence_no=network_dword(login_sequence);
ylfLog::AddBinText(buffer,packet_len);
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
PRINTOUT("FAILED:Login ,send packet failed.Disconnect...");
fDisconnect();
return -0xff;
}
Sleep(100);
//receive resp
DWORD dRevLen;
UINT starttime=time(NULL);
while(1) //GetMessage(&msg, NULL, 0, 0) )
{
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(MESSAGE_HEAD))
{
memset(buffer,0,MAX_CMPP_COM_BUF);
dRevLen=fReceive(buffer,sizeof(MAX_CMPP_COM_BUF));
if(phead->command_id==CMPP_CONNECT_REP)
{
if(*(buffer+sizeof(MESSAGE_HEAD))==0)
{
m_bAlive=TRUE; PRINTOUT("Login +OK.");
return 1;
}
else
{
PRINTOUT("FAILED: Login +FAILED.");
return -5;
}
}
}
if(bEventMainOver) {break;}
Sleep(100);
if(time(NULL)-starttime>MAX_CMPP_LOGINTIME) //5--10s
{
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
*****************************************************************************************/
int CCmppSock::fSendSM(char* destaddr,char* srcaddr,char* sendmsg,bool bResp)
{
//PRINTOUT((CString)destaddr + " Submit +OK.\n");
//return 1;
if(!m_bConnected)
{
return 0xFF;
if(fConnect(m_smscInfo.SMSCIP,m_smscInfo.uPort)<1)
{
PRINTOUT("FAILED:Submit , connect retrying");
return 0xFF;
}
}
if(!m_bAlive)
{
return 0xFF;
if(fLogin(m_smscInfo.usrName,m_smscInfo.passWd)<1)
{
PRINTOUT("FAILED: Submit , login retrying");
fDisconnect();
Sleep(3000);
return 0xFF;
}
}
if(destaddr[0]==0 || sendmsg[0]==0 )
{
PRINTOUT("FAILED: Submit , destadd or sendmsg is NULL") ;
return -1;
}
BYTE buffer[MAX_CMPP_COM_BUF];
struct MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)buffer;
BYTE* p=buffer+sizeof(struct MESSAGE_HEAD);
memset(buffer,0,MAX_CMPP_COM_BUF);
//武汉移动
p+=8; //msg id
*p++=1; //pk total
*p++=1; //pk number
*p++=0; //不返回确认报告
*p++=0; //msg level
strcpy((char*)p,"920480");
p+=10; //service_id
*p++=2; //fee user type
p+=21; //fee terminal_id
*p++=0; //tp_pid gsm protocal
*p++=0; //tp_udhi
*p++=8; //msg_fmt 0-ASCII 8-UCS2
strcpy((char*)p,m_smscInfo.usrName); p+=6; //msg src
strcpy((char*)p,"01"); p+=2; //fee type
strcpy((char*)p,"000000"); p+=6; //fee code
//strcpy((char*)p,"011119211000008+");
p+=17; //valid time
//strcpy((char*)p,"011119211000008+");
p+=17; //at time
strcpy((char*)p,srcaddr); p+=21; //src isdn
*p++=1; //dest user total
strcpy((char*)p,destaddr); p+=21; //dest isdn
p+=fill_message(p,sendmsg); //length and content
p+=8; //reserve
UINT packet_len=p-buffer;
UINT send_sequence=m_sequence++;
phead->command_id=network_dword(CMPP_SUBMIT);
phead->command_length=network_dword(packet_len);
phead->sequence_no=network_dword(send_sequence);
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
{
PRINTOUT("FAILED: Send Short Message ,send packet failed.disconnect...");
fDisconnect();
return -0xff;
}
}
Sleep(10);
if(!bResp) return 1;
DWORD dRevLen;
UINT starttime=time(NULL);
while(1)// GetMessage(&msg, NULL, 0, 0) )
{
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(MESSAGE_HEAD))
{
memset(buffer,0,MAX_CMPP_COM_BUF);
dRevLen=fReceive(buffer,sizeof(MAX_CMPP_COM_BUF));
if(phead->command_id==CMPP_ACTIVE_TEST)
{
phead->command_id=network_dword(CMPP_ACTIVE_TEST_REP);
phead->sequence_no=network_dword(phead->sequence_no);
phead->command_length=network_dword(sizeof(MESSAGE_HEAD)+1);
buffer[sizeof(MESSAGE_HEAD)]=0; //status
send(m_hSocket,(const char*)buffer,sizeof(MESSAGE_HEAD)+1,0);
}
else if(phead->command_id==CMPP_SUBMIT_REP)// && send_sequence==phead->sequence_no)
{
if(send_sequence!=phead->sequence_no)
{
char temp[100];
sprintf(temp,"sequence error submit=%d,ack=%d",send_sequence,phead->sequence_no);
puts(temp);
}
if(*(buffer+sizeof(MESSAGE_HEAD)+8)==0)
{
//PRINTOUT( " CMPP Submit +OK.");
return 1;
}
else
{
PRINTOUT("CMPP FAILED: Submit.");
return -2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -