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

📄 cmppsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -