⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smppsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 3 页
字号:


// 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 + -