📄 sgipsock.cpp
字号:
// SMPP Sock.cpp : implementation file
#include "stdafx.h"
#include "SGIPSock.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern struct _tagSMEConfig SMEConfig;
void CSGIPSock::network_head(struct SGIP_MESSAGE_HEAD* phead)
{
#if 1
phead->command_length=network_dword(phead->command_length);
phead->command_id=network_dword(phead->command_id);
phead->itime=network_dword(phead->itime);
phead->no=network_dword(phead->no);
phead->SP=network_dword(phead->SP);
#else
phead->command_length=htonl(phead->command_length);
phead->command_id=htonl(phead->command_id);
phead->itime=htonl(phead->itime);
phead->no=htonl(phead->no);
phead->SP=htonl(phead->SP);
#endif
// phead->sequence_no=network_dword(phead->sequence_no);
}
int CSGIPSock::fill_message(BYTE* pbody,const char* msg)
{
BYTE *p=pbody;
BYTE len=strlen(msg);
if(len>140) len=140;
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;
/*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;*/
}
/////////////////////////////////////////////////////////////////////////////
CSGIPSock::CSGIPSock()
{
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 CSGIPSock::CreateSocket()
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
if(m_hSocket==INVALID_SOCKET)
{
SGIP_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);
SGIP_PRINTOUT("FAILED:socket bind failed,close socket.....");
//int nErrorCode_=WSAGetLastError();
m_hSocket=INVALID_SOCKET;
return 0;
}
m_sequence=1;
return 1;
}
CSGIPSock::~CSGIPSock()
{
fLogout();
fDisconnect();
if(m_hEventMainOver) CloseHandle(m_hEventMainOver);
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSGIPSock, CSocket)
//{{AFX_MSG_MAP(CSGIPSock)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CSGIPSock 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 CSGIPSock::fLogin(char *usrname, char *passwd)
{
ClearBuffer();
if(m_bAlive) {SGIP_PRINTOUT("已登录."); return 0;}
if(!m_bConnected){SGIP_PRINTOUT("FAILED:socket连接尚未建立."); return -2;}
if(!usrname) {SGIP_PRINTOUT("FAILED:用户名为空.") ; return -1;}
strcpy(m_smscInfo.usrName,usrname);
strcpy(m_smscInfo.passWd,passwd);
SGIP_PRINTOUT("Logining.....");
BYTE buffer[MAX_SMPP_COM_BUF];
memset(buffer,0,MAX_SMPP_COM_BUF);
struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
BYTE *p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);
*p=1;///SP向SMG建立的连接,用于发送命令
p++;
p=(BYTE*)AddStrToBuf((char*)p,usrname,16);
p=(BYTE*)AddStrToBuf((char*)p,passwd,16);
p=(BYTE*)AddStrToBuf((char*)p,"",8);
phead->command_id=SGIP_BIND;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
// phead->sequence_no=m_sequence++;
int login_sequence[3];//=phead->sequence_no;
AddSequenceNO((char*)buffer,"382032",m_sequence++);
network_head(phead);
GetSequence(buffer,login_sequence);
// network_dword(login_sequence[0]);
//if(Send(buffer,packet_len)==SOCKET_ERROR)
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
{
SGIP_PRINTOUT("FAILED:Login ,send packet failed.Disconnect...");
fDisconnect();
return -0xff;
}
}
// Sleep(500);
//receive resp
DWORD 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,&dRevLen);
if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
{
memset(buffer,0,MAX_SMPP_COM_BUF);
dRevLen=fReceive(buffer,MAX_SGIP_RSP_BUF_LEN);
if(login_sequence[0]==phead->SP
/*&&login_sequence[1]==phead->itime*/
&&login_sequence[2]==phead->no
&& phead->command_id==SGIP_BIND_RESP)
{
BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
m_bAlive=TRUE; SGIP_PRINTOUT("Login +OK.");
return ty;
}
else
{
// SGIP_PRINTOUT("FAILED: Login +FAILED.");
// return -4;
continue;
}
}
Sleep(50);
if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
if(time(NULL)-starttime>MAX_SGIP_LOGINTIME) //5--10s
{
SGIP_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 CSGIPSock::fSendSM1(char* destaddr,char* srcaddr, const char* sendmsg,bool bResp)
{
//SGIP_PRINTOUT((CString)destaddr + " Submit +OK.\n");
//return 1;
if(!m_bConnected)
{
if(fConnect(m_smscInfo.SMSCIP,m_smscInfo.uPort)<1)
{
SGIP_PRINTOUT("FAILED:Submit , connect retrying");
return 0xFF;
}
}
if(!m_bAlive)
{
if(fLogin(m_smscInfo.usrName,m_smscInfo.passWd)<0)
{
SGIP_PRINTOUT("FAILED: Submit , login retrying");
// fDisconnect();
Sleep(3000);
return 0xFF;
}
}
if(destaddr[0]==0 || sendmsg[0]==0 )
{
SGIP_PRINTOUT("FAILED: Submit , destadd or sendmsg is NULL") ;
return -1;
}
BYTE buffer[MAX_SMPP_COM_BUF];
struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
BYTE* p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);
memset(buffer,0,MAX_SMPP_COM_BUF);
p=(BYTE*)AddStrToBuf((char*)p,srcaddr,21);
p=(BYTE*)AddStrToBuf((char*)p,"000000000000000000000",21);//付费号码
//p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//付费号码
*p++=1;//接收的用户数
p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//接收的号码
p=(BYTE*)AddStrToBuf((char*)p,"82032",5);//企业代码
p=(BYTE*)AddStrToBuf((char*)p,"xylsm",10);//业务代码 wangliang 2003.2.10
*p++=1;//记费类型
p=(BYTE*)AddStrToBuf((char*)p,"0",6);//该条短消息的收费值
p=(BYTE*)AddStrToBuf((char*)p,"0",6);//赠送用户的话费
*p++=0;//代收费标志,0:应收;1:实收
*p++=2;//引起MT消息的原因 2-非MO点播引起的MT消息
*p++=0;//优先级0-9从低到高,默认为0
p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值
p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息定时发送的时间,如果为空,表示立刻发送该短消息
*p++=2;//状态报告标记 1-该条消息无论最后是否成功都要返回状态报告
//*p++=0;//信息类型 0-短消息信息
*p++=0;//GSM协议类型。 0 The TP-UD field contains only the short message
*p++=0;//GSM 2TP_udhi协议类型。 0 The TP-UD field contains only the short message
*p++=15;//8;//短消息的编码格式 8:UCS2编码 15:gbk 0:ASSIC
*p++=0;//信息类型:0-短消息信息
// *p++=len;//短消息的长度
// int len=fill_message(p+1,sendmsg); //length and content
// p+=len;
///////////////////
p+=3;
int len=strlen(sendmsg);
*(DWORD*)p=(DWORD)len;
p++;
p=(BYTE*)AddStrToBuf((char*)p,(char*)sendmsg,len);
///////////////////
p=(BYTE*)AddStrToBuf((char*)p,"",8);//保留,扩展用
phead->command_id=SGIP_SUBMIT;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
AddSequenceNO((char*)buffer,"382032",m_sequence++);
TRACE("--------PACKET_LEN---%d\n",phead->command_length);
int send_sequence[3];
network_head(phead);
TRACE("--------PACKET_LEN---%d\n",phead->command_length);
GetSequence(buffer,send_sequence);
///////////////
// savebuffertofile((const char*)buffer);
//////////////
//if(Send(buffer,packet_len)==SOCKET_ERROR)
//修改对长TCP包一个send可能不能发送完
BYTE *pbuf=buffer;
len=0;
int ErrCode,SendNum=0;
BOOL bBeginSend=false;
while((len=send(m_hSocket,(const char*)pbuf,packet_len,0))!=packet_len)
{
if(len==SOCKET_ERROR)
{
ErrCode=WSAGetLastError();
if(ErrCode!= WSAEWOULDBLOCK)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect.....%d.",ErrCode);
// fDisconnect();
return -0xff;
}
else
{
if(bBeginSend)
{
SendNum++; //blocke err closeconnect
if(SendNum>500)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect....%d",ErrCode);
// fDisconnect();
return -0xff;
}
Sleep(30);
}
else
{
SendNum++; //block err closeconnect
if(SendNum>500)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect...%d",ErrCode);
// fDisconnect();
return -0xff;
}
Sleep(30);
}
}
}
else
{
bBeginSend=TRUE;
if(len==packet_len)
break;
pbuf+= len;
packet_len-= len;
}
}
// Sleep(50);
bResp=false; //不等待结果
if(!bResp) return 0;
FD_SET sockset = {1, m_hSocket};
TIMEVAL tv = {10, 0};
int result=select(0, &sockset, NULL, NULL, &tv);
DWORD 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 1
// while(1){
// dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
dRevLen=fReceive(buffer,MAX_SMPP_COM_BUF);
if(send_sequence[0]==phead->SP
&&send_sequence[1]==phead->itime
&&send_sequence[2]==phead->no
&&phead->command_id==SGIP_SUBMIT_RESP)
{
BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
return ty;
}
// 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,&dRevLen);
if(dRevLen>=sizeof(SGIP_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)
{
SGIP_PRINTOUT((CString)destaddr + " Submit +OK.\n");
return 1;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -