📄 platformdlg.cpp
字号:
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
param = pCmd->CreateParameter(_bstr_t("srcmobile"), adVarChar, adParamInput, 50, _bstr_t(sSrcterminalID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msg"), adVarChar, adParamInput, 160, _variant_t(pDestMsg));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("msgfmt"), adTinyInt, adParamInput, 1, _variant_t(ucMsgFmt));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("spnumber"), adVarChar, adParamInput, 50, _variant_t(sDestID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("linkID"), adVarChar, adParamInput, 50, _variant_t(""));
pCmd->Parameters->Append(param);
pCmd->CommandText = _bstr_t("insert_MODeliver");
pCmd->CommandType = adCmdStoredProc;
pCmd->Execute(NULL, NULL, adCmdStoredProc);
param.Detach()->Release();
pCmd.Detach()->Release();
}
catch(_com_error &e)
{
CString err = (char*)e.Description();
err = "执行存储过程insert_MODeliver失败,错误代码:" + err;
Write2RichEditAndLog(err);
param.Detach()->Release();
pCmd.Detach()->Release();
}
csMO.Lock();
MOQueue.push_back(msg);
csMO.Unlock();
}
else //此消息是状态报告
{
SReport report;
memcpy(&report, pDestMsg, sizeof(SReport));
char stat[8];
memcpy(stat, report.sStat, 7);
stat[7] = 0;
//////////////////////删除MTUNSENDQUEUE队列中已经得到状态报告的包月话单信息////////////////////////////////////
csMTUsend.Lock();
if (MTUnsendQueue.size() != 0)
{
deque<CMessage> ::iterator it = MTUnsendQueue.begin();
while (it != MTUnsendQueue.end())
{
if (it->nMsgID == report.sMsgId && it->sFeeType == 10 && strcmp(stat, "DELIVRD") == 0)//如果这个MSG的ID和状态报告的一致,并且是包月话单,并且状态返回是DELIVRD
{
MTUnsendQueue.erase(it);
CString str;
str.Format("删除MTUnsendQueue中的%u号包月话单消息", it->nRecID);
Write2RichEditAndLog(str);
break;
}
else
it ++;
}
}
csMTUsend.Unlock();
//////////////////////删除MTQUEUE队列中已经得到状态报告的包月话单信息////////////////////////////////////
csMT.Lock();
if (MTQueue.size() != 0)
{
deque<CMessage> ::iterator it = MTQueue.begin();
while (it != MTQueue.end())
{
if (it->nMsgID == report.sMsgId && it->sFeeType == 10 && strcmp(stat, "DELIVRD") == 0)//如果这个MSG的ID和状态报告的一致,并且是包月话单,并且状态返回是DELIVRD
{
MTQueue.erase(it);
CString str;
str.Format("删除MTQUEUE中的%u号包月话单消息", it->nRecID);
Write2RichEditAndLog(str);
break;
}
else
it ++;
}
}
csMT.Unlock();
/////////////////////////////执行insert_MTReport存储过程////////////////////////////
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
try
{
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
char MsgID[21];
sprintf(MsgID, "%I64u", report.sMsgId);
MsgID[20] = 0;
param = pCmd->CreateParameter(_bstr_t("MsgID"), adVarChar, adParamInput, 50, _bstr_t(MsgID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("UserNumber"), adVarChar, adParamInput, 50, _variant_t(report.sDstAddr));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("State"), adVarChar, adParamInput, 50, _variant_t(report.sStat));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("DoneTime"), adVarChar, adParamInput, 50, _variant_t(report.sDoneTime));
pCmd->Parameters->Append(param);
pCmd->CommandText = _bstr_t("insert_MTReport");
pCmd->CommandType = adCmdStoredProc;
pCmd->Execute(NULL, NULL, adCmdStoredProc);
CString err;
err.Format("收到状态反馈消息,MsgID为%s,返回值是%s", MsgID, stat);
Write2RichEditAndLog(err);
param.Detach()->Release();
pCmd.Detach()->Release();
}
catch(_com_error &e)
{
CString err = (char*)e.Description();
err = "执行存储过程insert_MTReport失败,错误代码:" + err;
Write2RichEditAndLog(err);
param.Detach()->Release();
pCmd.Detach()->Release();
break;
}
}
break;
}//end switch
}// end while
CoUninitialize();
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
// SGIPMTRec线程函数 //
////////////////////////////////////////////////////////////////////////////////////////////////
UINT SGIPMTRecThread(LPVOID pParam)
{
using namespace SGIP;
CoInitialize(NULL);
_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);
}
MessageHeader head;
UINT nCmdID, nSeqID[3], nTotalLen;
while (1)
{
memset(&head, 0, 20);
int nResult = recv(mtsocket, (char*)&head, 20, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开3");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
pMTRecThread->SuspendThread();
continue;
}
nCmdID = ntohl(head.nCommandID);
nSeqID[0] = head.nSeqNumber[0];
nSeqID[1] = head.nSeqNumber[1];
nSeqID[2] = head.nSeqNumber[2];
nTotalLen = ntohl(head.nTotalLen);
switch (nCmdID)
{
case SGIP_REPORT:
SReport Reportbody;
nResult = recv(mtsocket, (char*)&Reportbody, nTotalLen - 20, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关连接已断开4");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
pMTRecThread->SuspendThread();
continue;
}
struct tagREPORTRESP
{
MessageHeader head;
SReportResp body;
}REPORTRESP;
if (Reportbody.nReportType == 1)//如果是对先前一条前转Deliver命令的状态报告
{
REPORTRESP.head.nCommandID = htonl(SGIP_REPORT_RESP);
REPORTRESP.head.nSeqNumber[0] = nSeqID[0];
REPORTRESP.head.nSeqNumber[1] = nSeqID[1];
REPORTRESP.head.nSeqNumber[2] = nSeqID[2];
REPORTRESP.head.nTotalLen = htonl(sizeof(REPORTRESP));
REPORTRESP.body.nResult = 0;
memset(REPORTRESP.body.sReserve, 0, 8);
}
else //对先前一条Submit命令的状态报告
{
/////////////////////////////执行insert_MTReport存储过程////////////////////////////
_CommandPtr pCmd = NULL;
_ParameterPtr param = NULL;
try
{
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pCon1;
CString seqID;
seqID.Format("%u%u%u", ntohl(Reportbody.sSubmitSeqNumber[0]), ntohl(Reportbody.sSubmitSeqNumber[1]), ntohl(Reportbody.sSubmitSeqNumber[2]));
param = pCmd->CreateParameter(_bstr_t("seqID"), adVarChar, adParamInput, 50, _bstr_t(seqID));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("UserNumber"), adVarChar, adParamInput, 50, _variant_t(Reportbody.sUserNumber));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("State"), adUnsignedInt, adParamInput, 1, _variant_t(Reportbody.nState));
pCmd->Parameters->Append(param);
param = pCmd->CreateParameter(_bstr_t("ErrorCode"), adUnsignedInt, adParamInput, 1, _variant_t(Reportbody.nErrorCode));
pCmd->Parameters->Append(param);
pCmd->CommandText = _bstr_t("insert_MTReport");
pCmd->CommandType = adCmdStoredProc;
pCmd->Execute(NULL, NULL, adCmdStoredProc);
param.Detach()->Release();
pCmd.Detach()->Release();
}
catch(_com_error &e)
{
CString err = (char*)e.Description();
err = "执行存储过程insert_MTReport失败,错误代码是:" + err;
Write2RichEditAndLog(err);
param.Detach()->Release();
pCmd.Detach()->Release();
}
REPORTRESP.head.nCommandID = htonl(SGIP_REPORT_RESP);
REPORTRESP.head.nSeqNumber[0] = nSeqID[0];
REPORTRESP.head.nSeqNumber[1] = nSeqID[1];
REPORTRESP.head.nSeqNumber[2] = nSeqID[2];
REPORTRESP.head.nTotalLen = htonl(sizeof(REPORTRESP));
REPORTRESP.body.nResult = 0;
memset(REPORTRESP.body.sReserve, 0, 8);
if (Reportbody.nState != 0)
{
CString str;
str.Format("收到%u号消息发送错误的REPORT信息,State是:%u,ErrorCode是:%u", ntohl(Reportbody.sSubmitSeqNumber[2]),
Reportbody.nState, Reportbody.nErrorCode);
Write2RichEditAndLog(str);
}
else
{
CString str;
str.Format("收到%u号消息发送正确的REPORT信息", ntohl(Reportbody.sSubmitSeqNumber[2]));
Write2RichEditAndLog(str);
}
}
nResult = send(mtsocket, (char*)&REPORTRESP, sizeof(REPORTRESP), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
TRACE1(_T("发送SGIP_REPORT_RESP消息出错,错误代码是:%u \n"), WSAGetLastError());
CString err;
err.Format("发送SGIP_REPORT_RESP消息出错,错误代码是:%u", WSAGetLastError());
Write2RichEditAndLog(err);
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
CloseSocket(mtsocket);
IsMTConnected = FALSE;
}
break;
case SGIP_UNBIND:
MessageHeader head;
head.nCommandID = htonl(SGIP_UNBIND_RESP);
head.nSeqNumber[0] = nSeqID[0];
head.nSeqNumber[1] = nSeqID[1];
head.nSeqNumber[2] = nSeqID[2];
head.nTotalLen = htonl(sizeof(MessageHeader));
nResult = send(mtsocket, (char*)&head, sizeof(head), 0);
if (SOCKET_ERROR == nResult || 0 == nResult)
{
CString err;
err.Format("发送SGIP_UNBIND_RESP消息出错,错误代码是:%d", WSAGetLastError());
Write2RichEditAndLog(err);
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
}
CloseSocket(mtsocket);
IsMTConnected = FALSE;
break;
case SGIP_BIND_RESP:
SBindResp BindRespbody;
nResult = recv(mtsocket, (char*)&BindRespbody, nTotalLen - 20, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关的连接已断开5");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
pMTRecThread->SuspendThread();
continue;
}
if (BindRespbody.nResult != 0)
{
IsMTConnected = FALSE;
CString err;
err.Format("MT连接返回错误,错误代码:%d",BindRespbody.nResult);
Write2RichEditAndLog(err);
}
else
{
Write2RichEditAndLog("登录短信网关成功!");
Write2RichEditAndLog("MTGREEN");
IsMTConnected = TRUE;
}
break;
case SGIP_SUBMIT_RESP:
csSubmitNum.Lock();
if (nSubmitNum > 0)
nSubmitNum --;
csSubmitNum.Unlock();
SSubmitResp SubmitRespbody;
nResult = recv(mtsocket, (char*)&SubmitRespbody, nTotalLen - 20, 0);
if (nResult == 0 || nResult == SOCKET_ERROR)
{
Write2RichEditAndLog("MT连接长时间无数据接收, 和短信网关连接已断开6");
CloseSocket(mtsocket);
IsMTConnected = FALSE;
csSubmitNum.Lock();
nSubmitNum = 0;
csSubmitNum.Unlock();
pMTRecThread->SuspendThread();
con
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -