📄 platformdlg.cpp
字号:
{
using namespace SGIP;
CoInitialize(NULL);
IsMTConnected = FALSE;
//////////////////////////连接ISMG//////////////////////////////////
BOOL nResult = FALSE;
if (!IsMTConnected) //如果没有连接上
nResult = SGIPMTConnectISMG();
while (!nResult)
{
Sleep(2000);
nResult = SGIPMTConnectISMG();
}
while (!IsMTConnected) //等待连接成功
Sleep(1);
/////////////////////////////从消息队列中取出消息并发送//////////////////////////////////
//填充SUBMIT结构
struct tagSUBMIT
{
MessageHeader head;
SSubmit body;
}Submit;
_ConnectionPtr pCon1 = NULL;
/////////////////////////////连接数据库//////////////////////////////////////
csConfig.Lock();
CString strCon = "Provider=SQLOLEDB; Server=";
strCon = strCon + g_config.DBServer;
strCon = strCon + "; Database=";
strCon = strCon + g_config.Database;
strCon = strCon + "; uid=";
strCon = strCon + g_config.DBUser;
strCon = strCon + "; pwd=";
strCon = strCon + g_config.DBPwd;
csConfig.Unlock();
try
{
pCon1 = NULL;
HRESULT hr = pCon1.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
{
::MessageBox(NULL,"连接数据库失败","连接数据库失败",MB_OK | MB_ICONWARNING);
return TRUE;
}
pCon1->Open(strCon.AllocSysString(),"", "", adConnectUnspecified);
}
catch (_com_error &e)
{
::MessageBox(NULL,e.Description(),"连接数据库失败",MB_OK | MB_ICONWARNING);
}
for(;1;)
{
csMT.Lock();
int nMTSize = MTQueue.size();
csMT.Unlock();
if (nMTSize == 0) //检查MTQueue是否为空
{
Sleep(10);
continue;
}
csMT.Lock();
CMessage msg = MTQueue.front();
csMT.Unlock();
CString Mobile(msg.sMobileNum);
if (Mobile == "MTActiveTest")
{
MessageHeader head;
head.nCommandID = htonl(SGIP_ACTIVE_TEST);
csConfig.Lock();
head.nSeqNumber[0] = htonl(g_config.SPNODEID); //源节点编号
csConfig.Unlock();
head.nSeqNumber[1] = htonl(GenTimeData()); //时间戳
head.nSeqNumber[2] = htonl(0); //在SUBMIT结构里面nSequenceID为消息的nRecID
head.nTotalLen = htonl(sizeof(MessageHeader));
int nResult = send(mtsocket, (char*)&head, sizeof(MessageHeader), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
Write2RichEditAndLog("发送ACTIVETEST消息时MT和短信网关的连接已经断开");
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
CloseSocket(mtsocket);
IsMTConnected = FALSE;
//////////////////////////连接ISMG///////////////////////////////////////////////////
nResult = FALSE;
while (!nResult)
{
Sleep(2000);
nResult = SGIPMTConnectISMG();
}
int nStep = 0;
while (!IsMTConnected)
{
Sleep(10);
nStep += 1;
if (nStep > 200) //如果等待IsMTConnected超时,则关闭连接并继续
{
CloseSocket(mtsocket);
break;
}
}
continue;
}
//////////////////////////////////////删除队列头//////////////////////////////////////////
csMT.Lock();
MTQueue.pop_front();
csMT.Unlock();
continue;
}
Submit.head.nCommandID = htonl(SGIP_SUBMIT); //命令ID
csConfig.Lock();
Submit.head.nSeqNumber[0] = htonl(g_config.SPNODEID); //源节点编号
csConfig.Unlock();
Submit.head.nSeqNumber[1] = htonl(GenTimeData()); //时间戳
Submit.head.nSeqNumber[2] = htonl(msg.nRecID); //在SUBMIT结构里面nSequenceID为消息的nRecID
Submit.head.nTotalLen = htonl(sizeof(Submit) + strlen(msg.sMsg) + 8); //长度
memset(Submit.body.sSPNumber, 0, 21);
csConfig.Lock();
memcpy(Submit.body.sSPNumber, msg.sSrcMobile, strlen(msg.sSrcMobile)); //SP特服号
csConfig.Unlock();
memset(Submit.body.sChargeNumber, 0, 21);
memcpy(Submit.body.sChargeNumber, msg.sChargeNumber, strlen(msg.sChargeNumber)); //付费号码
Submit.body.nUserCount = 1; //终端用户数量
memset(Submit.body.sUserNumber, 0, 21);
memcpy(Submit.body.sUserNumber, msg.sMobileNum, strlen(msg.sMobileNum)); //目的手机号码
memset(Submit.body.sCorpId, 0, 5);
csConfig.Lock();
memcpy(Submit.body.sCorpId, g_config.SPID, g_config.SPID.GetLength()); //企业代码
csConfig.Unlock();
memset(Submit.body.sServiceType, 0, 10);
memcpy(Submit.body.sServiceType, msg.sServiceID, strlen(msg.sServiceID)); //业务代码
if (msg.sFeeType == 10) //此SUBMIT用于产生包月话单
{
Submit.body.nMorelatetoMTFlag = 2; //引起MT消息的原因,SP管理系统下需要改为2
Submit.body.nFeeType = 3; //计费用户类型为包月
Submit.body.nReportFlag = 3; //该条消息仅携带包月计费信息,不下发给用户,要返回状态报告
}
else if (msg.sFeeType == 6) //定制成功通知消息
{
Submit.body.nMorelatetoMTFlag = 0; //引起MT消息的原因
Submit.body.nFeeType = 1; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
strcpy(msg.sFeeCode, "000000");
}
else if (msg.sFeeType == 7) //定制失败通知消息
{
Submit.body.nMorelatetoMTFlag = 2; //引起MT消息的原因
Submit.body.nFeeType = 1; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
strcpy(msg.sFeeCode, "000000");
memcpy(Submit.body.sChargeNumber, "000000000000000000000", 21); //付费号码
}
else if (msg.sFeeType == 8) //退定成功通知消息
{
Submit.body.nMorelatetoMTFlag = 0; //引起MT消息的原因
Submit.body.nFeeType = 1; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
strcpy(msg.sFeeCode, "000000");
}
else if (msg.sFeeType == 9) //退定失败通知消息
{
Submit.body.nMorelatetoMTFlag = 2; //引起MT消息的原因
Submit.body.nFeeType = 1; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
strcpy(msg.sFeeCode, "000000");
memcpy(Submit.body.sChargeNumber, "000000000000000000000", 21); //付费号码
}
else if (msg.sFeeType == 3) //如果是包月普通下行信息
{
Submit.body.nMorelatetoMTFlag = 2; //引起MT消息的原因
Submit.body.nFeeType = 1; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
strcpy(msg.sFeeCode, "000000");
}
else
{
Submit.body.nMorelatetoMTFlag = 0; //引起MT消息的原因
Submit.body.nFeeType = msg.sFeeType; //计费用户类型
Submit.body.nReportFlag = 0; //该条消息出错时返回状态报告
}
memset(Submit.body.sFeeValue, 0, 6);
itoa(atoi(msg.sFeeCode), msg.sFeeCode, 10); //去掉前面的000
memcpy(Submit.body.sFeeValue, msg.sFeeCode, strlen(msg.sFeeCode)); //资费代码
memset(Submit.body.sGivenValue, 0, 6);
memcpy(Submit.body.sGivenValue, "0", 1); //赠送用户的话费
Submit.body.nAgentFlag = 0; //代收费标志,0:应收;1:实收
Submit.body.nPriority = 9; //信息级别
memset(Submit.body.sExpireTime, 0, 16); //短消息寿命的终止时间
memset(Submit.body.sScheduleTime, 0, 16); //短消息定时发送的时间
Submit.body.nTP_pid = 0; //测试用
Submit.body.nTP_udhi = 0; //测试用
Submit.body.nMessageCoding = msg.sMsgFmt; //短消息的编码格式
Submit.body.nMessageType = 0; //信息格式
Submit.body.nMessageLen = htonl(strlen(msg.sMsg)); //短消息的长度
char *pBuf = NULL;
pBuf = new char[sizeof(Submit) + strlen(msg.sMsg) + 8];
memcpy(pBuf, &Submit, sizeof(Submit));
memcpy(pBuf + sizeof(Submit), msg.sMsg, strlen(msg.sMsg)); //信息内容
memcpy(pBuf + sizeof(Submit) + strlen(msg.sMsg), msg.sLinkID, 8); //LINKID
csSubmitNum.Lock();
short nNum = nSubmitNum;
csSubmitNum.Unlock();
while (nNum >= maxwindow) //如果发送SUBMIT而没有应答的数量大于最大滑动窗口,则挂起100MS返回
{
Sleep(100);
csSubmitNum.Lock();
nNum = nSubmitNum;
csSubmitNum.Unlock();
continue;
}
//发送SUBMIT消息
//添加到MTUnsendQueue队列
CTime t = CTime::GetCurrentTime();
CString time = t.Format("%y%m%d%H%M%S");
strcpy(msg.sDatetime, time);
msg.nSendCount ++;
csMTUsend.Lock();
MTUnsendQueue.push_back(msg);
csMTUsend.Unlock();
//删除MTQueue队列头
csMT.Lock();
MTQueue.pop_front();
csMT.Unlock();
int nResult = send(mtsocket, pBuf, sizeof(Submit) + strlen(msg.sMsg) + 8, 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
if (pBuf != NULL)
{
delete[] pBuf;
pBuf = NULL;
}
Write2RichEditAndLog("发送SUBMIT消息时MT和短信网关的连接已经断开");
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
CloseSocket(mtsocket);
IsMTConnected = FALSE;
//////////////////////////连接ISMG////////////////////////////
nResult = FALSE;
while (!nResult)
{
Sleep(2000);
nResult = SGIPMTConnectISMG();
}
int nStep = 0;
while (!IsMTConnected)
{
Sleep(10);
nStep += 1;
if(nStep > 200) //如果等待IsMTConnected超时,则关闭连接并继续
{
CloseSocket(mtsocket);
break;
}
}
continue;
}
if (pBuf != NULL)
{
delete[] pBuf;
pBuf = NULL;
}
csSubmitNum.Lock();
nSubmitNum ++;
csSubmitNum.Unlock();
Sleep(msgsendinterval);//休眠msgsendinterval毫秒
}
CoUninitialize();
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
// CMPPMTRec线程函数 //
////////////////////////////////////////////////////////////////////////////////////////////////
UINT CMPPMTRecThread(LPVOID pParam)
{
using namespace CMPP;
CoInitialize(NULL);
MessageHeader header;
char Body[512];
int nResult;
UINT nCmdID, nSeqID, nTotalLen;
_ConnectionPtr pCon1 = NULL;
/////////////////////////////连接数据库//////////////////////////////////////
csConfig.Lock();
CString strCon = "Provider=SQLOLEDB; Server=";
strCon = strCon + g_config.DBServer;
strCon = strCon + "; Database=";
strCon = strCon + g_config.Database;
strCon = strCon + "; uid=";
strCon = strCon + g_config.DBUser;
strCon = strCon + "; pwd=";
strCon = strCon + g_config.DBPwd;
csConfig.Unlock();
try
{
pCon1 = NULL;
HRESULT hr = pCon1.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
{
::MessageBox(NULL,"连接数据库失败","连接数据库失败",MB_OK | MB_ICONWARNING);
return TRUE;
}
pCon1->Open(strCon.AllocSysString(),"", "", adConnectUnspecified);
}
catch (_com_error &e)
{
::MessageBox(NULL,e.Description(),"连接数据库失败",MB_OK | MB_ICONWARNING);
}
while (1)
{
memset(&header, 0, 12);
nResult = recv(mtsocket, (char*)&header, 12, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开1");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
pMTRecThread->SuspendThread();
continue;
}
nSeqID = header.nSequenceID;
nCmdID = ntohl(header.nCommandID);
nTotalLen = ntohl(header.nTotalLen);
nResult = recv(mtsocket, Body, nTotalLen - 12, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开2");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
pMTRecThread->SuspendThread();
continue;
}
switch (nCmdID)
{
case CMPP_CONNECT_RESP:
Write2RichEditAndLog("MT收到CMPP_CONNECT_RESP");
struct tagCONNECTREP
{
SConnectResp body;
}CONNECTRESP;
memcpy(&CONNECTRESP, Body, sizeof(CONNECTRESP));
if (CONNECTRESP.body.ucStatus != 0)
{
IsMTConnected = FALSE;
CString err;
err.Format("%u",CONNECTRESP.body.ucStatus);
err = "MT连接返回消息报错,错误代码是:" + err;
Write2RichEditAndLog(err);
}
else
{
Write2RichEditAndLog("MT连接登录短信网关成功!");
Write2RichEditAndLog("MTGREEN");
IsMTConnected = TRUE;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -