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

📄 cmpp_client.cpp

📁 河南移动的cmpp的基础类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else
	{	
		strcpy(Submit.Src_terminal_id,m_SrcID);
	}
	strcpy(Submit.Dest_terminal_id,DestTerminal);//Dest_terminal_id是指短信的接收的手机的号码
	Submit.Msg_Length=MsgLength;//有效信息长度,绝对短于短信的tcp/ip包长度
	Submit.Msg_Fmt=MsgFmt;//短信的格式 0:ASCII串  3:短信写卡操作  4:二进制信息  8:UCS2编码15:含GB汉字  
	Submit.Registered_Delivery=Registered_Delivery;//改字段表示是否要求返回状态确认报告:0:不需要1:需要2:产生SMC话单

	char SendText[256]={0};
	int CurPos=0;
	int i=0;


	char UCS_Code[2048];
	char gbCode[256];

	MsgLength =CMPP_Head::ASCII_To_UNICOD(MsgContext,UCS_Code);

	for(;;i++)
	{
		ZeroMemory(SendText,256);
		if((CurPos+EACH_SMS_LEN)>=MsgLength)
		{
			Submit.GetMsgID(Submit.Msg_id);
			ZeroMemory(gbCode,256);
			memcpy(gbCode,UCS_Code+CurPos,MsgLength-CurPos);
			if(MsgLength/EACH_SMS_LEN>=1)
			{
				strcat(SendText,"(完)");
			}
			Submit.Msg_Length=(char)strlen(SendText);
			Submit.TotalLength=(DWORD)htonl(sizeof(CMPP_Submit)+(int)strlen(SendText)+8);
			ZeroMemory(buffer,1024);
			memcpy(buffer ,&Submit,sizeof(CMPP_Submit));
			memcpy(buffer + sizeof(CMPP_Submit),SendText,strlen(SendText));
			m_CMPPSocket.Send(buffer,ntohl(Submit.TotalLength),UserID);
			break;
		}
		else
		{
			Submit.GetMsgID(Submit.Msg_id);


			ZeroMemory(gbCode,256);
			memcpy(gbCode,UCS_Code+CurPos,EACH_SMS_LEN);
			CMPP_Head::UCS2_To_ASCII((LPCWSTR)gbCode,EACH_SMS_LEN,SendText);
			CurPos+=EACH_SMS_LEN;

			char tail[80];
			if( MsgLength%EACH_SMS_LEN==0)
			{
				sprintf(tail,"(共%d页,第%d页)",i+1,MsgLength/EACH_SMS_LEN);
			}
			else
			{
				sprintf(tail,"(共%d页,第%d页)",i+1,MsgLength/EACH_SMS_LEN+1);
			}

			strcat(SendText, tail);

			Submit.Msg_Length=(char)strlen(SendText);
			Submit.TotalLength=(DWORD)htonl(sizeof(CMPP_Submit)+(int)strlen(SendText)+8);

			ZeroMemory(buffer,1024);
			memcpy(buffer,&Submit,sizeof(CMPP_Submit));

			memcpy(buffer+sizeof(CMPP_Submit),SendText,strlen(SendText));
            
			m_CMPPSocket.Send(buffer,ntohl(Submit.TotalLength),UserID);
		}
		Sleep(20);//移动的限制是每秒一个sp的总数在50个以内
	}
	m_ListMsg.InsertStringToQueue(0, "短消息已经发送,发送号码:%s, 接收号码:%s, 内容:%s, 短信ID=%d;SocketID=%d", 
		Submit.Src_terminal_id, Submit.Dest_terminal_id, MsgContext, (short)Submit.Msg_id[6], UserID);
	return 0;
	//BYTE buffer[1024];
	//CMPP_Submit Submit;
	//DWORD UserID  = GetSendID();
	//if(UserID >= 0XFFFF)
	//	return -3;

	///*!!!!!!!!!!!记住调试完要删除注释
	//if(! m_bCanUsed)
	//	return -1;*/

	//strcpy(Submit.Service_id, m_SrcID);//将serviceid拷贝到提交的类中
	//strcpy(Submit.Fee_terminal_id, FeeTerminal);
	//if( strlen(MsgSrc) ==0 )
	//	strcpy(Submit.Msg_src, m_DefaultMsgSrc);
	//else
	//	strcpy(Submit.Msg_src, MsgSrc);

	//memcpy(Submit.FeeType, FeeType, 2);
	//strncpy(Submit.FeeCode, FeeCode, __min(6, strlen(FeeCode)));

	//if(strlen(SrcId) != 0)
	//	strcpy(Submit.Src_terminal_id, SrcId);
	//else
	//	strcpy(Submit.Src_terminal_id, m_SrcID);

	//strcpy(Submit.Dest_terminal_id, DestTerminal);
	//Submit.Msg_Length = MsgLength;
 //	Submit.Msg_Fmt = MsgFmt;
	//Submit.Registered_Delivery = Registered_Delivery;
	//
	////add by ghost for Msg too long 
	//char SendText[256]={0};
	//int CurPos = 0;
	//int i=0;
	//
	////add by ghost on 2004 4 25
	//char UCS_Code[2048];
	//char gbCode[256];
	//MsgLength = CMPP_Head::ASCII_To_UNICOD(MsgContext, UCS_Code);
	//// add end
	//
	//for(;;i++)
	//{
	//	ZeroMemory(SendText, 256);
	//	if ( (CurPos + EACH_SMS_LEN) >= MsgLength )//一条就可以发送完毕
	//	{
	//		Submit.GetMsgID(Submit.Msg_id);

	//		//复制发送的内容
	//		ZeroMemory(gbCode, 256);
	//		memcpy(gbCode, UCS_Code + CurPos, MsgLength - CurPos );
	//		ZeroMemory(SendText, 256);
	//		CMPP_Head::UCS2_To_ASCII( (LPCWSTR)gbCode, MsgLength - CurPos, SendText);
	//		
	//		if(MsgLength/EACH_SMS_LEN >= 1 )//add by ghost on 2004-6-28
	//			strcat(SendText, "(完)");

	//		//修改包头的长度
	//		Submit.Msg_Length = (char)strlen(SendText);
	//		
	//		Submit.TotalLength = (DWORD)htonl(sizeof(CMPP_Submit) + (int)strlen(SendText) + 8 );

	//		ZeroMemory(buffer, 1024);
	//		memcpy(buffer, &Submit, sizeof(CMPP_Submit));
	//		
	//		//复制发送消息
	//		memcpy(buffer + sizeof(CMPP_Submit), SendText, strlen(SendText) );

	//		//发送消息到CMPP网关
	//		m_CMPPSocket.Send(buffer, ntohl(Submit.TotalLength), UserID);
	//		break;
	//	}
	//	else
	//	{
	//		Submit.GetMsgID(Submit.Msg_id);

	//		//复制发送的内容
	//		ZeroMemory(gbCode, 256);
	//		memcpy(gbCode, UCS_Code + CurPos, EACH_SMS_LEN );
	//		ZeroMemory(SendText, 256);
	//		CMPP_Head::UCS2_To_ASCII( (LPCWSTR)gbCode, EACH_SMS_LEN, SendText);
	//		CurPos += EACH_SMS_LEN;

	////		m_ListMsg.InsertStringToQueue(1, "Step--3");
	//		char tail[80];
	//		if(MsgLength%EACH_SMS_LEN == 0)
	//			sprintf(tail, "(第%d页 共%d页)", i+1, MsgLength/EACH_SMS_LEN);
	//		else
	//			sprintf(tail, "(第%d页 共%d页)", i+1, MsgLength/EACH_SMS_LEN + 1);
	//		strcat(SendText, tail);
	//		
	////		m_ListMsg.InsertStringToQueue(1, "Step--4");
	//		//修改包头的长度
	//		Submit.Msg_Length = (char)strlen(SendText);
	//		Submit.TotalLength = (DWORD)htonl(sizeof(CMPP_Submit) + (int)strlen(SendText) + 8 );
	//		
	//		//memcpy(buffer, &Submit.TotalLength, 4);
	//		ZeroMemory(buffer, 1024);
	//		memcpy(buffer, &Submit, sizeof(CMPP_Submit));
	//		
	//		//复制发送消息
	//		memcpy(buffer + sizeof(CMPP_Submit), SendText, strlen(SendText) );

	//		//发送消息到CMPP网关
	//		m_CMPPSocket.Send(buffer, ntohl(Submit.TotalLength), UserID);
	//	}
	//	Sleep(20);

	//}
 //	m_ListMsg.InsertStringToQueue(0, "短消息已经发送,发送号码:%s, 接收号码:%s, 内容:%s, 短信ID=%d;SocketID=%d", 
	//	Submit.Src_terminal_id, Submit.Dest_terminal_id, MsgContext, (short)Submit.Msg_id[6], UserID);
	//return 0;
}

void CCMPP_Client::Query(char * pTime, char * pCode, DWORD UserID)
{
	CMPP_Query Query;

	memcpy(Query.Time, pTime, 8);
	if( strlen(pCode) == 0)
	{
		//查询总数
		Query.Query_Type = 0;
	}
	else
	{
		Query.Query_Type = 1;
		memcpy(Query.Query_Code, pCode, __min(strlen(pCode), 10));
	}

	m_CMPPSocket.Send((BYTE*)&Query, sizeof(CMPP_Query), UserID);
}


int CCMPP_Client::SubmitFee(DWORD SocketID, char *Serial, char *SP_Code, char *Number, int UserType, char * FeeType, int Fee, char *voc_id, char *voc_name)
{
	char temp[80];
	BYTE buffer[1024];
	CMPP_Submit Submit;
	char SendText[128]={0};

	DWORD UserID  = GetSendID();
	if(UserID == 0)
		return -3;

	/*if(! m_bCanUsed)
		return -1;*/

	//加入链表中
	m_cs.Lock();

	FeeNode Node;
	Node.SocketID = SocketID;
	Node.Sequence = ntohl(Submit.SequenceID);
	strcpy(Node.Serial, Serial);

	strcpy( Node.SP_Code, SP_Code);
	strcpy( Node.Number, Number);
	Node.UserType = UserType;
	strcpy( Node.FeeType, FeeType);
	Node.Fee = Fee;
	strcpy(Node.voc_id, voc_id);
	strcpy(Node.voc_name, voc_name);
	m_FeeList.push_back(Node);

	m_cs.Unlock();

	////test
	//DeliverReport Report;
 //	strcpy(Report.Stat, "1DELIVRD");

	//FeeResult( Report );
	//
	//return 0;
	
	//ZeroMemory(&Submit, sizeof(CMPP_Submit));
	Submit.Pk_total = 1;
	Submit.Pk_number = 1;

	
	if(strncmp(FeeType, "03", 2) == 0)
	{
		//发送给短信中心
 		sprintf(SendText, "已经扣除彩铃包月信息费:%5.2f(元)。", (Fee * 1.0)/100);
		strncpy( Submit.FeeType, "03", 2 );
		Submit.Registered_Delivery = 2;//只计费,不发送短信
		sprintf( temp, "CLBY%d", Fee/100 ); 
		strncpy( Submit.Service_id, temp, __min(10, strlen(temp)) ); 
		Submit.Msg_Length = 0;

		Submit.Fee_UserType = 0;
		strcpy(Submit.Fee_terminal_id, Number);
	}
	else
	{
		//发送给短信中心
 		sprintf(SendText, "下载铃音确认信息,铃音编号:%s;名称:%s;价格:%5.2f(元)。", voc_id, voc_name, (Fee * 1.0)/100);
		strncpy(Submit.FeeType, "02", 2);
		Submit.Registered_Delivery = 1;//需要产生报告,并发送短信,单条必须为1
		sprintf(temp, "CL%d", Fee/10);
		strncpy( Submit.Service_id, temp, __min(10, strlen(temp)) );
		Submit.Msg_Length = (char)strlen(SendText);
		strcpy(Submit.Fee_terminal_id, Number);
		Submit.Fee_UserType = 0;
	}
 	

	//strcpy(Submit.Msg_src, SP_Code);
	strncpy(Submit.Msg_src, m_DefaultMsgSrc, __min(strlen(m_DefaultMsgSrc),6));
	

	sprintf(temp, "%06d", Fee);
	strncpy(Submit.FeeCode, temp, __min(strlen(temp), 6));

	strncpy(Submit.Src_terminal_id, m_SrcID, __min(strlen(m_SrcID), 21));

	strncpy(Submit.Dest_terminal_id, Number, __min(strlen(Number), 21) );

	//消息头
	Submit.TotalLength = htonl(sizeof(CMPP_Submit) + Submit.Msg_Length + 8 );

	ZeroMemory(buffer, 1024);
	memcpy(buffer, &Submit, sizeof(CMPP_Submit));
			
	//复制发送消息
	memcpy(buffer + sizeof(CMPP_Submit), SendText, strlen(SendText) );

	//发送消息到CMPP网关
	int ret = m_CMPPSocket.Send(buffer, ntohl(Submit.TotalLength), UserID);
	
	if(ret > 0)
		m_ListMsg.InsertStringToQueue(0, "--> 计费消息已经发送,发送号码:%s, 接收号码:%s, ", Submit.Src_terminal_id, Submit.Dest_terminal_id);
	else
		m_ListMsg.InsertStringToQueue(0, "--> 计费消息发送失败,发送号码:%s, 接收号码:%s, ", Submit.Src_terminal_id, Submit.Dest_terminal_id);

	return ret;
}

void  CCMPP_Client::SetMsgID(DWORD Sequence, char * MsgID)
{
	FeeNode Node;
	m_cs.Lock();
	for( vector<FeeNode>::iterator Iter = m_FeeList.begin(); 
		Iter != m_FeeList.end(); Iter++ )
	{
		Node = (FeeNode)*Iter;
		if(Node.Sequence == Sequence)
		{
			memcpy(Node.MsgID, MsgID, 8);
			m_FeeList.erase(Iter);
			m_FeeList.push_back(Node);

			TRACE("SAVE:%d%d%d%d%d%d%d%d\r\n", Node.MsgID[0], Node.MsgID[1],Node.MsgID[2],Node.MsgID[3],Node.MsgID[4],Node.MsgID[5],Node.MsgID[6], Node.MsgID[7]);
			break;
		}
	}
	m_cs.Unlock();

}


//TYPE=7004(计费的响应消息)计费手机号码|序列号(8位)|结果(0失败、1-成功)|计费类型(0:按条计费;1:包月方式)|用户类型(0-全球通;1-神州行)|铃音编号
//
void  CCMPP_Client::FeeResult( DeliverReport Report )
{
	char buffer[1024];
	FeeNode Node;

	TRACE("Get:%d%d%d%d%d%d%d%d\r\n", Report.Msg_Id[0], Report.Msg_Id[1],Report.Msg_Id[2],Report.Msg_Id[3],Report.Msg_Id[4],Report.Msg_Id[5],Report.Msg_Id[6], Report.Msg_Id[7]);
	m_cs.Lock();
	for(vector<FeeNode>::iterator Iter = m_FeeList.begin(); Iter != m_FeeList.end(); Iter++)
	{
		Node = (FeeNode)*Iter;
		

		TRACE("Node:%d%d%d%d%d%d%d%d\r\n", Node.MsgID[0], Node.MsgID[1],Node.MsgID[2],Node.MsgID[3],Node.MsgID[4],Node.MsgID[5],Node.MsgID[6], Node.MsgID[7]);
		if( memcmp(Node.MsgID, Report.Msg_Id, 8) == 0)
		{
			m_FeeList.erase(Iter);
			TRACE("Delete Fee List Node Number=%s,Sequence=%ld\r\n", Node.Number, Node.Sequence);

			//回复计费结果	
			if( strncmp(Report.Stat, "DELIVRD", 7) == 0 )
			{
				sprintf(buffer, "HEAD|7004|%s|%s|1|%s|%d|%s|END", Node.Number, Node.Serial, Node.FeeType, Node.UserType, Node.voc_id );
				//写话单
				CProxyServer::WriteShenZhouFee( Node.SocketID, Node.SP_Code, Node.Number, Node.UserType, Node.FeeType, Node.Fee, Node.voc_id, Node.voc_name);
			}
			else
			{
				//缴费失败
				sprintf(buffer, "HEAD|7004|%s|%s|0|%s|%d|%s|END", Node.Number, Node.Serial, Node.FeeType, Node.UserType, Node.voc_id );
			}

			//获得接收短新的ID
			DWORD RcvID = 0;
			if( CProxyServer::m_RcvSMClientList.size() > 0)
			{
				RcvID = CProxyServer::m_RcvSMClientList[0];
			}
			if(RcvID != Node.SocketID)
				m_ProxySvrSocket.SendData(Node.SocketID, (unsigned char*)buffer, CProxyServer::MsgLen);//from wwww
			
			m_ProxySvrSocket.SendData(RcvID, (unsigned char*)buffer, CProxyServer::MsgLen);

			break;
		}
	}
	m_cs.Unlock();
}

//如果超时将该节点删除
void CCMPP_Client::FeeListErase()
{
	char buffer[1024];
	FeeNode Node;
	vector<FeeNode> temp;

	m_cs.Lock();
	for(vector<FeeNode>::iterator Iter = m_FeeList.begin(); Iter != m_FeeList.end(); Iter++)
	{
		Node = (FeeNode)*Iter;
	//	m_FeeList.erase(Iter);
		Node.Count --;
		if(Node.Count >= 0 )
		{
			TRACE("Delete Fee List Node Number=%s,Sequence=%ld\r\n", Node.Number, Node.Sequence);
			temp.push_back(Node);
		}
		else//超时发送失败消息
		{
			//TYPE=7004(计费的响应消息)计费手机号码|序列号(8位)|结果(0失败、1-成功)|计费类型(0:按条计费;1:包月方式)|用户类型(0-全球通;1-神州行)|铃音编号
			sprintf(buffer, "HEAD|7004|%s|%s|0|%s|%d|%s|END", Node.Number, Node.Serial, Node.FeeType, Node.UserType, Node.voc_id );
			
			m_ProxySvrSocket.SendData(Node.SocketID, (unsigned char*)buffer, CProxyServer::MsgLen);
		}
	}
	m_FeeList = temp;
	m_cs.Unlock();
}



DWORD CCMPP_Client::GetSendID(void)
{
	for(int i=0 ;i < m_SocketCount; i++)
	{
		m_LastUserID ++;
		if(m_LastUserID >= m_SocketCount)
			m_LastUserID = 0;
		if( m_CMPPSocket.GetPort(m_LastUserID) > 0 )
			return m_LastUserID;
	}
	return 0XFFFF;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -