📄 cmpp_client.cpp
字号:
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 + -