📄 platformdlg.cpp
字号:
case CMPP_TERMINATE_RESP:
Write2RichEditAndLog("MT收到CMPP_TERMINATE_RESP");
break;
case CMPP_TERMINATE:
Write2RichEditAndLog("MT收到CMPP_TERMINATE");
MessageHeader sendhead;
sendhead.nCommandID = htonl(CMPP_TERMINATE_RESP);
sendhead.nSequenceID = nSeqID;
sendhead.nTotalLen = htonl(sizeof(MessageHeader));
nResult = send(mtsocket, (char*)&sendhead,sizeof(MessageHeader), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
CString err;
err = "MT发送CMPP_TERMINATE_RESP消息时连接已断开";
Write2RichEditAndLog(err);
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
}
CloseSocket(mtsocket);
IsMTConnected = FALSE;
break;
case CMPP_SUBMIT_RESP:
csSubmitNum.Lock();
if (nSubmitNum > 0)
nSubmitNum --;
csSubmitNum.Unlock();
struct tagSUBMITREP
{
SSubmitResp body;
}SUBMITRESP;
memcpy(&SUBMITRESP, Body, sizeof(SUBMITRESP));
{
CMessage msg;
//////////////////////删除MTUNSENDQUEUE队列中已经得到回复的消息////////////////////////////////////
csMTUsend.Lock();
if (MTUnsendQueue.size() != 0)
{
deque<CMessage> ::iterator it = MTUnsendQueue.begin();
int index = 0;
while (it != MTUnsendQueue.end())
{
if (it->nRecID == ntohl(header.nSequenceID))
{
it->nMsgID = SUBMITRESP.body.sMsgId;
msg = *it;
if (msg.sFeeType != 10) //如果不是包月话单的话,则删除这个MSG;如果是包月话单,则在收到状态报告并正确后删除
{
MTUnsendQueue.erase(it);
}
break;
}
else
it ++;
}
}
csMTUsend.Unlock();
//////////////////////删除MTQUEUE队列中已经得到回复的消息////////////////////////////////////
csMT.Lock();
if (MTQueue.size() != 0)
{
deque<CMessage> ::iterator it = MTQueue.begin();
int index = 0;
while (it != MTQueue.end())
{
if (it->nRecID == ntohl(header.nSequenceID))
{
it->nMsgID = SUBMITRESP.body.sMsgId;
msg = *it;
if (msg.sFeeType != 10) //如果不是包月话单的话,则删除这个MSG;如果是包月话单,则在收到状态报告并正确后删除
{
MTQueue.erase(it);
}
break;
}
else
{
it ++;
index ++;
}
}
}
csMT.Unlock();
if (msg.nRecID == 0)
break;
if (SUBMITRESP.body.ucResult != 0)//发送失败
{
CString err;
err.Format("返回CMPP_SUBMIT_RESP消息报错,Result代码是:%d,序列号是:%d",SUBMITRESP.body.ucResult, ntohl(nSeqID));
Write2RichEditAndLog(err);
//执行存储过程intsert_MTailsend
try
{
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
_RecordsetPtr pRec1 = NULL;
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
pCmd->CommandText = _bstr_t("insert_MTFailsend");
pCmd->CommandType = adCmdStoredProc;
param = pCmd->CreateParameter(_bstr_t("RecID"), adBSTR, adParamInput, 21, _variant_t(msg.nRecID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _variant_t(msg.sMobileNum));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("fee_type"), adTinyInt, adParamInput, 1, _variant_t(msg.sFeeType));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("fee_code"), adBSTR, adParamInput, 6, _variant_t(msg.sFeeCode));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msg"), adBSTR, adParamInput, 160, _variant_t(msg.sMsg));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("time"), adBSTR, adParamInput, 50, _variant_t(msg.sDatetime));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("srcmobile"), adBSTR, adParamInput, 21, _variant_t(msg.sSrcMobile));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("serviceID"), adBSTR, adParamInput, 10, _variant_t(msg.sServiceID)); //业务代码
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(msg.sMsgFmt));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("chargenumber"), adBSTR, adParamInput, 21, _variant_t(msg.sChargeNumber));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("sendcount"), adSmallInt, adParamInput, 2, _variant_t(msg.nSendCount));
pCmd->Parameters->Append(param);
pCmd->Execute(NULL, NULL, adCmdStoredProc);
CString str;
str.Format("%u号消息发送失败,已存储到MTFailsend表中", msg.nRecID);
Write2RichEditAndLog(str);
}
catch (_com_error &e)
{
TRACE1("执行insert_MTailsend错误,错误代码:%s/n", (char*)e.Description());
CString err = (char*)e.Description();
err = "执行insert_MTailsend错误,错误代码:" + err;
Write2RichEditAndLog(err);
}
}
else //执行insert_MTSended存储过程
{
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
try
{
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
char MsgID[21];
sprintf(MsgID, "%I64u", SUBMITRESP.body.sMsgId);
MsgID[20] = 0;
param = pCmd->CreateParameter(_bstr_t("recID"), adInteger, adParamInput, 4, _variant_t((long)msg.nRecID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _bstr_t(msg.sMobileNum));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("fee_type"), adTinyInt, adParamInput, 1, _variant_t(msg.sFeeType));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("fee_code"), adBSTR, adParamInput, 6, _bstr_t(msg.sFeeCode));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msg"), adBSTR, adParamInput, 160, _bstr_t(msg.sMsg));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("time"), adBSTR, adParamInput, 50, _bstr_t(msg.sDatetime));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("srcmobile"), adBSTR, adParamInput, 21, _bstr_t(msg.sSrcMobile));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("serviceID"), adBSTR, adParamInput, 10, _bstr_t(msg.sServiceID)); //业务代码
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(msg.sMsgFmt));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("chargenumber"), adBSTR, adParamInput, 21, _bstr_t(msg.sChargeNumber));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("MsgID"), adBSTR, adParamInput, 50, _bstr_t(MsgID));
pCmd->Parameters->Append(param);
pCmd->CommandText = _bstr_t("insert_MTSended");
pCmd->CommandType = adCmdStoredProc;
pCmd->Execute(NULL, NULL, adCmdStoredProc);
CString str;
str.Format("%u号消息发送短信网关成功!目标:%s,消息内容:%s", msg.nRecID, msg.sMobileNum, msg.sMsg);
Write2RichEditAndLog(str);
param.Detach()->Release();
pCmd.Detach()->Release();
}
catch(_com_error &e)
{
CString err = (char*)e.Description();
err = "执行存储过程insert_MTSended错误,错误代码:" + err;
Write2RichEditAndLog(err);
err.Format("SUBMIRT_RESP SequenceID:%u, msg.nRecID:%u", ntohl(header.nSequenceID), msg.nRecID);
Write2RichEditAndLog(err);
param.Detach()->Release();
pCmd.Detach()->Release();
}
}
}
break;
case CMPP_QUERY_RESP:
break;
case CMPP_CANCEL_RESP:
break;
case CMPP_ACTIVE_TEST_RESP:
// Write2RichEditAndLog("收到CMPP_ACTIVE_TEST_RESP");
break;
case CMPP_ACTIVE_TEST:
Write2RichEditAndLog("MT收到CMPP_ACTIVE_TEST");
struct tagACTIVETESTRESP{
MessageHeader head;
SActiveTestResp body;
}ACTIVETESTRESP;
ACTIVETESTRESP.head.nCommandID = htonl(CMPP_ACTIVE_TEST_RESP);
ACTIVETESTRESP.head.nSequenceID = nSeqID;
ACTIVETESTRESP.head.nTotalLen = htonl(sizeof(ACTIVETESTRESP));
ACTIVETESTRESP.body.cSuccId = 0;
nResult = send(mtsocket, (char*)&ACTIVETESTRESP,sizeof(ACTIVETESTRESP), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
Write2RichEditAndLog("发送ACTIVE_TEST_RESP时和短信网关的连接已断开");
CloseSocket(mtsocket);
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
IsMTConnected = FALSE;
}
break;
case CMPP_DELIVER:
char *pBuf = new char[nTotalLen - sizeof(MessageHeader)];
memcpy(pBuf, Body, nTotalLen - sizeof(MessageHeader));
char sMsgID[9];
char sDestID[22];
char sServiceID[11];
u_char ucTpPid;
u_char ucTpUdhi;
u_char ucMsgFmt;
char sSrcterminalID[22];
u_char ucRegister;
u_char ucMsgLen;
memcpy(sMsgID, pBuf, 8);
memcpy(sDestID, pBuf + 8, 21);
memcpy(sServiceID, pBuf + 8 + 21, 10);
memcpy(&ucTpPid, pBuf + 8 + 21 + 10, 1);
memcpy(&ucTpUdhi, pBuf + 8 + 21 + 10 + 1, 1);
memcpy(&ucMsgFmt, pBuf + 8 + 21 + 10 + 1 + 1, 1);
memcpy(sSrcterminalID, pBuf + 8 + 21 + 10 + 1 + 1 + 1, 21);
memcpy(&ucRegister, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21, 1);
memcpy(&ucMsgLen, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21 + 1, 1);
char *pMessageContent = new char[ucMsgLen];
memcpy(pMessageContent, pBuf + 8 + 21 + 10 + 1 + 1 + 1 + 21 + 1 + 1, ucMsgLen);
delete []pBuf;
///////////////////////////////////向网关回复消息/////////////////////////////////
struct tagDELIVERRESP
{
MessageHeader head;
SDeliverResp body;
}DELIVERRESP;
DELIVERRESP.head.nCommandID = htonl(CMPP_DELIVER_RESP);
DELIVERRESP.head.nSequenceID = nSeqID;
DELIVERRESP.head.nTotalLen = htonl(sizeof(DELIVERRESP));
memcpy(DELIVERRESP.body.sMsgId, sMsgID, 8);
DELIVERRESP.body.ucResult = 0;
nResult = send(mtsocket, (char*)&DELIVERRESP, sizeof(DELIVERRESP), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
CString err;
err.Format("发送CMPP_DELIVER_RESP消息出错,错误代码是:%u", WSAGetLastError());
Write2RichEditAndLog(err);
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
CloseSocket(mtsocket);
IsMTConnected = FALSE;
continue;
}
//////////////////////////////////结束向网关回复消息////////////////////////////////
//////////////////////////将UCS2转换成GBK/////////////////////////
char pDestMsg[160];
if (ucMsgFmt == 8)
{
UCS2ToGB(pMessageContent, ucMsgLen, pDestMsg);
ucMsgFmt = 15;
}
else
{
memcpy(pDestMsg, pMessageContent, ucMsgLen);
pDestMsg[ucMsgLen] = 0;
}
delete []pMessageContent;
//////////////////////////如果是CMCCTEST//////////////////////////
/* CString test(pDestMsg);
test.MakeUpper();
test.Trim();
if (test == "CMCCTEST")
{
CString msg;
CTime t = CTime::GetCurrentTime();
csConfig.Lock();
msg.Format("北京,太力信通,%s,%s,%d月 %d日 %d时 %d分", g_config.ServiceID, g_config.SPID, t.GetMonth(),
t.GetDay(),t.GetHour(),t.GetMinute());
csConfig.Unlock();
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
try
{
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
param = pCmd->CreateParameter(_bstr_t("mobile"), adBSTR, adParamInput, 21, _variant_t(sSrcterminalID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("feetype"), adTinyInt, adParamInput, 1, _variant_t((byte)2));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("feecode"), adChar, adParamInput, 6, _variant_t(_bstr_t("000001")));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msg"), adChar, adParamInput, 160, _variant_t(msg));
pCmd->Parameters->Append(param);
csConfig.Lock();
param = pCmd->CreateParameter(_bstr_t("srcmobile"), adChar, adParamInput, 21, _variant_t(g_config.ServiceID.AllocSysString()));
pCmd->Parameters->Append(param);
csConfig.Unlock();
param = pCmd->CreateParameter(_bstr_t("serviceID"), adChar, adParamInput, 10, _variant_t("CMCCTEST")); //业务代码
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(byte(15)));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("chargenumber"), adChar, adParamInput, 21, _variant_t(sSrcterminalID));
pCmd->Parameters->Append(param);
pCmd->CommandText = _bstr_t("insert_MTQueue");
pCmd->CommandType = adCmdStoredProc;
pCmd->Execute(NULL, NULL, adCmdStoredProc);
param.Detach()->Release();
pCmd.Detach()->Release();
}
catch(_com_error &e)
{
Write2RichEditAndLog(e.ErrorMessage());
param.Detach()->Release();
pCmd.Detach()->Release();
}
break;
}
*/ //////////////////////////结束如果是CMCCTEST////////////////////////
if (ucRegister == 0) //此消息非状态报告
{
CMessage msg(0,
sDestID,
"",
pDestMsg,
0,
"",
"",
sSrcterminalID,
sServiceID,
ucMsgFmt,
"");
CString str;
str.Format("收到DELIVER,发自:%s,内容:%s", sSrcterminalID, pDestMsg);
Write2RichEditAndLog(str);
/////////////////////////////执行insert_MODeliver存储过程////////////////////////////
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
try
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -