1、增加签名校验功能,在TD2Signature表中有的记录才允许发送。

2、CSgip,修改了发送规则,断连时等到连接恢复后再发送短信
This commit is contained in:
lujiang 2025-03-19 16:47:14 +08:00
parent b10841b3d1
commit 53133d3841
10 changed files with 286 additions and 17 deletions

View File

@ -14,7 +14,7 @@
广州首易信息技术有限公司
2024年2月
2025年2月
目录
一、引言 4
@ -1513,6 +1513,10 @@
|-110 |短信内容长度不符合要求 |Sms_Send |
|-111 |没有发送短信权限 |Sms_Send |
|-112 |目标号码数量不符合要求 |Sms_Send |
|-113 |此企业禁止非模板短信 |Sms_Send |
|-114 |此用户禁止非模板短信 |Sms_Send |
|-115 |此企业禁止客户端短信 |Sms_Send |
|-116 |此用户禁止客户端短信 |Sms_Send |
|-122 |用户状态异常 |Sms_Send |
|-123 |企业状态异常 |Sms_Send |
|-124 |用户权限不足 |Sms_Send |

View File

@ -588,6 +588,10 @@ Method不存在
此企业禁止非模板短信
-114
此用户禁止非模板短信
-115
此企业禁止客户端短信
-116
此用户禁止客户端短信
-122
用户状态异常
-123

View File

@ -100,7 +100,6 @@ BEGIN
LTEXT "地址",IDC_STATIC,12,68,17,8
LTEXT "用户",IDC_STATIC,12,82,17,8
LTEXT "密码",IDC_STATIC,85,82,17,8
EDITTEXT IDC_MSG2,170,9,297,172,ES_MULTILINE | ES_READONLY | ES_WANTRETURN
PUSHBUTTON "test",IDC_TEST,4,0,25,15
EDITTEXT IDC_EDIT1,7,33,147,12,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL
EDITTEXT IDC_MSG3,170,198,297,155,ES_MULTILINE | ES_READONLY | ES_WANTRETURN
@ -128,12 +127,21 @@ BEGIN
LTEXT "Window",IDC_STATIC,12,255,25,8
EDITTEXT IDC_DELAY,117,237,24,12,ES_AUTOHSCROLL | ES_NUMBER
LTEXT "Delay",IDC_STATIC,93,239,21,8
CONTROL "强制去签名",IDC_EXCM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,288,56,10
CONTROL "检测签名",IDC_CHECKCM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,288,48,10
CONTROL "显示日志",IDC_SHOWLOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,185,49,10
CONTROL "强制去签名",IDC_EXCM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,288,56,10
CONTROL "半",IDC_EXCM2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,288,24,10
CONTROL "不处理Ret",IDC_NORET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,301,52,10
CONTROL "不处理Report",IDC_NOREPORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,301,64,10
CONTROL "半",IDC_EXCM2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,288,24,10
CONTROL "不处理上行",IDC_NORECV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,315,56,10
CONTROL "拼接长短信",IDC_SUPLONGSMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,315,56,10
CONTROL "除去长信标记",IDC_EXPLONGSMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,328,64,10
LTEXT "数据包大小",IDC_STATIC,80,330,41,8
EDITTEXT IDC_ONEPACKSMSCOUNT,123,327,24,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "号码不加86",IDC_NO86,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,341,54,10
CONTROL "校验报备签名",IDC_VERIFYSIGNNATURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,342,64,10
EDITTEXT IDC_MSG2,170,9,297,172,ES_MULTILINE | ES_READONLY | ES_WANTRETURN
LTEXT "中国移动",IDC_TDMSG,12,130,145,8
CONTROL "显示日志",IDC_SHOWLOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,185,49,10
PUSHBUTTON "test2",IDC_TEST2,4,16,25,14
PUSHBUTTON "清零",IDC_0,134,51,24,12,0,WS_EX_STATICEDGE
LTEXT "select",IDC_STATIC,12,270,25,8
@ -147,16 +155,9 @@ BEGIN
LTEXT "--",IDC_S_ZD_SEND2,143,105,9,8
LTEXT "A",IDC_SELECT_DB,107,105,8,8
LTEXT "--",IDC_S_ZD_RECV2,143,117,9,8
LTEXT "中国移动",IDC_TDMSG,12,130,145,8
PUSHBUTTON "运营商设置",IDC_TDSETUP,15,105,56,18
CONTROL "拼接长短信",IDC_SUPLONGSMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79,315,56,10
CONTROL "除去长信标记",IDC_EXPLONGSMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,328,64,10
LTEXT "数据包大小",IDC_STATIC,80,331,41,8
EDITTEXT IDC_ONEPACKSMSCOUNT,123,328,24,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "不处理上行",IDC_NORECV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,315,56,10
CONTROL "显示详细日志",IDC_SHOWLOG2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,227,185,64,10
LTEXT "Prov",IDC_STATIC,85,68,17,8
CONTROL "号码不加86",IDC_NO86,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,341,54,10
END
IDD_TDSETUP DIALOGEX 0, 0, 366, 317

View File

@ -83,6 +83,7 @@ CFXSendDlg::CFXSendDlg(CWnd* pParent /*=NULL*/)
, m_bNoRecv(FALSE)
, m_strDBProvider(_T(""))
, m_lCheckReSend(0)
, m_bVerifySignature(FALSE)
{
//{{AFX_DATA_INIT(CFXSendDlg)
m_strIP = _T("");
@ -297,6 +298,7 @@ void CFXSendDlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_DBPROVIDER, m_strDBProvider);
DDV_MaxChars(pDX, m_strDBProvider, 30);
DDX_CBIndex(pDX, IDC_CHECKRESEND, m_lCheckReSend);
DDX_Check(pDX, IDC_VERIFYSIGNNATURE, m_bVerifySignature);
}
BEGIN_MESSAGE_MAP(CFXSendDlg, CDialog)
@ -399,6 +401,7 @@ BOOL CFXSendDlg::OnInitDialog()
m_bCheckBack = m_MCom_Head.bCheckBack;
m_bMainReSend = m_MCom_Head.bMainReSend;
m_bCheckCM = m_MCom_Head.bCheckCM;
m_bVerifySignature = m_MCom_Head.bVerifySignature;
m_bExCM = m_MCom_Head.bExCM;
m_bExCM2 = m_MCom_Head.bExCM2;
m_bNo86 = m_MCom_Head.bNo86;
@ -612,6 +615,7 @@ void CFXSendDlg::OnSave()
m_MCom_Head.lDelay = m_lDelay;
m_MCom_Head.bMainReSend=m_bMainReSend;
m_MCom_Head.bCheckCM = m_bCheckCM;
m_MCom_Head.bVerifySignature = m_bVerifySignature;
m_MCom_Head.bExCM = m_bExCM;
m_MCom_Head.bExCM2 = m_bExCM2;
m_MCom_Head.bNo86 = m_bNo86;
@ -1485,6 +1489,130 @@ try
break;
}
if (pDlg->m_MCom_Head.bVerifySignature) //检验报备签名,如果没在运营商报备的签名不能发送,本步骤取出每条短信的签名
{
for (int i = 0; i < lDelCount; i++)
{
long lSignatureStart = 0; //签名起始位置
CString strSignatureMsg = pMT[i].Msg; //含签名的内容
CString strSignature;
//判断内容是否为长信
if (strSignatureMsg.GetLength() > 7 &&
strSignatureMsg.Left(2) == CString(_T("长信")) &&
strSignatureMsg.Mid(6, 1) == CString(_T(":")))
{
if (strSignatureMsg.Mid(5, 1) != CString(_T("1"))) //不是长信第一条,需要取长信第一条
{
BOOL bGetSignatureMsg = false;
strSignatureMsg = _T("");
//先从已读取的内容中取第一条内容
for (int j = 0; j < lDelCount; j++)
{
if (/*pMT[j].SendNum == pMT[i].SendNum &&*/
pMT[j].RecvNum == pMT[i].RecvNum &&
pMT[j].Msg.GetLength() > 7 &&
pMT[j].Msg.Left(2) == CString(_T("长信")) &&
pMT[j].Msg.Mid(6, 1) == CString(_T(":")) &&
pMT[j].Msg.Mid(5, 1) == CString(_T("1")) &&
pMT[j].Msg.Mid(2, 2) == pMT[i].Msg.Mid(2, 2))
{
strSignatureMsg = pMT[j].Msg;
bGetSignatureMsg = true;
break;
}
}
//再从发送表的内容中取第一条
if (!bGetSignatureMsg)
{
CSingleLock cl(&pDlg->m_MT_FS_Lock, true);
POSITION pos = pDlg->m_MT_FS.GetHeadPosition(); // 获取链表头部位置
while (pos != NULL)
{
FXSend_MT mt = pDlg->m_MT_FS.GetNext(pos); // 获取当前元素并移动位置
// 处理 value
if (/*mt.SendNum == pMT[i].SendNum &&*/
mt.RecvNum == pMT[i].RecvNum &&
mt.Msg.GetLength() > 7 &&
mt.Msg.Left(2) == CString(_T("长信")) &&
mt.Msg.Mid(6, 1) == CString(_T(":")) &&
mt.Msg.Mid(5, 1) == CString(_T("1")) &&
mt.Msg.Mid(2, 2) == pMT[i].Msg.Mid(2, 2))
{
strSignatureMsg = mt.Msg;
bGetSignatureMsg = true;
break;
}
}
cl.Unlock();
}
//再从已发送表的内容中取第一条
if (!bGetSignatureMsg)
{
CSingleLock cl(&pDlg->m_MT_YF_Lock, true);
POSITION pos = pDlg->m_MT_YF.GetHeadPosition(); // 获取链表头部位置
while (pos != NULL)
{
FXSend_MT mt = pDlg->m_MT_YF.GetNext(pos); // 获取当前元素并移动位置
// 处理 value
if (/*mt.SendNum == pMT[i].SendNum &&*/
mt.RecvNum == pMT[i].RecvNum &&
mt.Msg.GetLength() > 7 &&
mt.Msg.Left(2) == CString(_T("长信")) &&
mt.Msg.Mid(6, 1) == CString(_T(":")) &&
mt.Msg.Mid(5, 1) == CString(_T("1")) &&
mt.Msg.Mid(2, 2) == pMT[i].Msg.Mid(2, 2))
{
strSignatureMsg = mt.Msg;
bGetSignatureMsg = true;
break;
}
}
cl.Unlock();
}
//再从数据库中读取第一条内容
if (strSignatureMsg.GetLength() <= 0)
{
str.Format(_T("select msg from smssend with(nolock) where sendid>%d and sendid<%d and Recvnum='%s' and sendnum='%s' and substring(msg,3,2)='%s' and substring(msg,6,1)='1'"), pMT[i].SendID - 200, pMT[i].SendID + 200, pMT[i].RecvNum, pMT[i].SendNum, pMT[i].Msg.Mid(2, 2));
if (AdoRS.Open(str) && !AdoRS.IsEOF())
{
AdoRS.GetCollect(_T("Msg"), strSignatureMsg);
}
else
{
//发送表查不到,需要到已发表查询
str.Format(_T("select msg from corpsmsm.dbo.smssend with(nolock) where sendid>%d and sendid<%d and Recvnum='%s' and substring(msg,3,2)='%s' and substring(msg,6,1)='1'"), pMT[i].SendID - 200, pMT[i].SendID + 200, pMT[i].RecvNum, pMT[i].Msg.Mid(2, 2));
if (AdoRS.Open(str) && !AdoRS.IsEOF())
{
AdoRS.GetCollect(_T("Msg"), strSignatureMsg);
}
}
}
}
//因为是长短信,签名内容先去掉长信标识
strSignatureMsg = strSignatureMsg.Mid(7); //取7个字符后的内容
}
//取签名
long lSignatureMsgLen = strSignatureMsg.GetLength();
if (strSignatureMsg.Left(1) == CString(_T(""))) //内容是以"【"开头的,开始取签名
{
for (int i = 1; i < lSignatureMsgLen && i < 21; i++)
{
if (strSignatureMsg.Mid(i, 1) == "")
{
strSignature = strSignatureMsg.Mid(1, i - 1); //取到签名
break;
}
}
}
if (strSignature.GetLength() > 0 && strSignature.GetLength() < 20) //有效签名
{
pMT[i].strSignature = strSignature;
}
}
}
//在send中删除
if (!bOnlySubmitMmsFile) //不是提交彩信模板的,取出后需要删除
{
@ -1513,6 +1641,7 @@ try
//判断是否需要换另一个检索方法
lSelectType==1?bSelectTimer=true:bSelectNoTimer=true; //记录是否有检索记录
//开始发送,将需要发送的短信加入到发送列表
strTemp.Format( _T("发送 正在提交%d条...") , lDelCount );
AddLogMsg(Send, strTemp );
@ -1810,6 +1939,26 @@ try
_tcscpy(szMsg , mt.Msg );
#ifndef SMSCENTER_NX
long lMsgLen =_tcslen(szMsg);
if (pDlg->m_MCom_Head.bVerifySignature) //检验报备签名,如果没在运营商报备的签名不能发送
{
if (!pDlg->VerifySignature(&AdoRS2, &mt, szSendNum2))
{
lBackStatus = -121;
strTemp.Format(_T("发送 %d %s %d,签名校验失败"), mt.CorpID, mt.RecvNum, mt.SendID);
AddLogMsg(Send, strTemp);
mt.Status = 11; //发送失败
mt.RecvStatus.Format(_T("TJ-签%d"), lBackStatus);
mt.SendTime = COleDateTime::GetCurrentTime();
b = pDlg->WriteSendRetToCorpSmsM(&AdoRS2, &mt);
if (!b) //数据库异常
{
bSql = false;
}
continue;
}
}
if ( pDlg->m_MCom_Head.bCheckCM )
{
/*
@ -6317,6 +6466,95 @@ void CFXSendDlg::GetCurrentPath(TCHAR * pPath)
pPath[j+1]=0;
}
typedef struct _TD2SignatureSmsNum
{
long lSignatureID;
CString strSmsNum;
}TD2SignatureSmsNum;
typedef CList<TD2SignatureSmsNum, TD2SignatureSmsNum&> CTD2SignatureSmsNum;
BOOL CFXSendDlg::VerifySignature(CAdoRecordSet* pAdoRS, FXSend_MT* pMT, TCHAR * pSrcNum)
{
BOOL bVerfitySignature = false;
CString str;
CString strSignatrue = pMT->strSignature;
if (strSignatrue.GetLength() < 1) //签名小于1的校验不通过
{
return bVerfitySignature;
}
CTD2SignatureSmsNum SmsNumList;
long lMinSmsNumLen = 21; //最小的端口号长度
long lSmsNumCount = 0;
str.Format(_T("select top 100 * from TD2Signature with(nolock) where Signature='%s' and status=2 and TDID=%d order by SignatureID desc"), SQLStr(strSignatrue), m_MCom_Head.lSendFCS );
pAdoRS->Open(str);
for (int i = 0; i < 100 && !pAdoRS->IsEOF(); i++)
{
TD2SignatureSmsNum smsNum;
pAdoRS->GetCollect(_T("SmsNum"), smsNum.strSmsNum); //取端口号
pAdoRS->GetCollect(_T("SignatureID"), smsNum.lSignatureID); //取ID
SmsNumList.AddTail(smsNum);
if (smsNum.strSmsNum.GetAllocLength() < lMinSmsNumLen) //取最小的长度
lMinSmsNumLen = smsNum.strSmsNum.GetAllocLength();
pAdoRS->MoveNext();
lSmsNumCount++;
}
if (lSmsNumCount <= 0)
{
return bVerfitySignature;
}
CString strSendNum = pMT->SendNum;
int iSendNumLen = strSendNum.GetLength();
for (int j = iSendNumLen; j >= 2 && j >= lMinSmsNumLen; j--) //发送号码从长到短匹配
{
CString strSendNum2 = strSendNum.Left(j);
POSITION pos = SmsNumList.GetHeadPosition(); // 获取链表头部位置
while (pos != NULL)
{
TD2SignatureSmsNum mt = SmsNumList.GetNext(pos); // 获取当前元素并移动位置
if (strSendNum2 == mt.strSmsNum)
{
bVerfitySignature = true;
pMT->SendNum = mt.strSmsNum; //更改发送号码
_tcscpy(pSrcNum, mt.strSmsNum);//更改发送号码
//计数增加1
str.Format(_T("update TD2Signature set SendCount=SendCount+1 where SignatureID=%d"), mt.lSignatureID);
pAdoRS->Open(str);
break;
}
}
if (bVerfitySignature) //匹配上签名
{
break;
}
}
if (!bVerfitySignature && SmsNumList.GetCount() > 0)
{
TD2SignatureSmsNum mt = SmsNumList.GetHead(); // 取第一条记录
bVerfitySignature = true;
pMT->SendNum = mt.strSmsNum; //更改发送号码
_tcscpy(pSrcNum, mt.strSmsNum);//更改发送号码
//计数增加1
str.Format(_T("update TD2Signature set SendCount=SendCount+1 where SignatureID=%d"), mt.lSignatureID);
pAdoRS->Open(str);
}
return bVerfitySignature;
}
long CFXSendDlg::WriteSendRetToCorpSmsM(CAdoRecordSet * pAdoRS,FXSend_MT * pMT)
{
CString str;

View File

@ -470,6 +470,7 @@ public:
BOOL FS_Add(FXSend_MT mt);
BOOL FS_Get(FXSend_MT & mt);
static CString SQLStr(CString & str);
BOOL VerifySignature(CAdoRecordSet* pAdoRS, FXSend_MT* pMT, TCHAR* pSrcNum);
long WriteSendRetToCorpSmsM(CAdoRecordSet * pAdoRS,FXSend_MT * pMT);
long WriteSendRetToCorpSmsM2(CAdoRecordSet * pAdoRS,FXSend_MT * pMT,CString & strValues);
long WriteSendRetToCorpSmsM_XY(CAdoRecordSet * pAdoRS,FXSend_MT * pMT);
@ -674,6 +675,7 @@ public:
afx_msg void OnCbnSelchangeCheckresend();
int m_lCheckReSend;
static CStringA UnicodeToString(TCHAR * pMsg);
BOOL m_bVerifySignature;
};
//{{AFX_INSERT_LOCATION}}

View File

@ -128,6 +128,7 @@ namespace MobsetApi {
m_lReqReturn = ns1__Sms_USCORESendResponse->Count;
return SOAP_OK;
}
BOOL bTemplateSms = false;
if (ns1__Template_USCORESendSms != nullptr) //模板短信转发的,将参数转移过来
{
ns1__Sms_USCORESend->soap = ns1__Template_USCORESendSms->soap;
@ -140,6 +141,8 @@ namespace MobsetApi {
ns1__Sms_USCORESend->LongSms = 1; //默认为长短信
ns1__Sms_USCORESend->MobileList = ns1__Template_USCORESendSms->MobileList;
ns1__Sms_USCORESend->Content = NULL;
bTemplateSms = true;
}
CFXSendDlg* pDlg = (CFXSendDlg*)m_pParam;
@ -254,14 +257,14 @@ namespace MobsetApi {
return SOAP_OK;
}
if (userPro.dwCorpSDK & SDK_PROHIBITNONTEMPLATE) //禁止非模板短信
if (!bTemplateSms && (userPro.dwCorpSDK & SDK_PROHIBITNONTEMPLATE) ) //如果是非模板短信,并且禁止非模板短信
{
*ns1__Sms_USCORESendResponse->ErrMsg = L"此企业禁止非模板短信";
ns1__Sms_USCORESendResponse->Count = -113;
m_lReqReturn = ns1__Sms_USCORESendResponse->Count;
return SOAP_OK;
}
if (userPro.dwSDK & SDK_PROHIBITNONTEMPLATE) //禁止非模板短信
if (!bTemplateSms && (userPro.dwSDK & SDK_PROHIBITNONTEMPLATE) ) //如果是非模板短信,并且禁止非模板短信
{
*ns1__Sms_USCORESendResponse->ErrMsg = L"此用户禁止非模板短信";
ns1__Sms_USCORESendResponse->Count = -114;
@ -2817,6 +2820,7 @@ namespace MobsetApi {
CFXSendDlg* pDlg = (CFXSendDlg*)m_pParam;
BOOL bTemplateSms = false;
long lCorpID = ns1__Mms_USCORESend->CorpID;
m_lReqCorpID = lCorpID;
CString strLoginName;
@ -2886,6 +2890,22 @@ namespace MobsetApi {
m_lReqReturn = ns1__Mms_USCORESendResponse->Count;
return SOAP_OK;
}
if (!bTemplateSms && (userPro.dwCorpSDK & SDK_PROHIBITNONTEMPLATE)) //如果是非模板短信,并且禁止非模板短信
{
*ns1__Mms_USCORESendResponse->ErrMsg = L"此企业禁止非模板短信";
ns1__Mms_USCORESendResponse->Count = -113;
m_lReqReturn = ns1__Mms_USCORESendResponse->Count;
return SOAP_OK;
}
if (!bTemplateSms && (userPro.dwSDK & SDK_PROHIBITNONTEMPLATE)) //如果是非模板短信,并且禁止非模板短信
{
*ns1__Mms_USCORESendResponse->ErrMsg = L"此用户禁止非模板短信";
ns1__Mms_USCORESendResponse->Count = -114;
m_lReqReturn = ns1__Mms_USCORESendResponse->Count;
return SOAP_OK;
}
CString str;
BOOL bAtTime = false;
CString strTimer = _T("NULL");

View File

@ -475,8 +475,12 @@ DWORD WINAPI CSgip::SocketSend(LPVOID lParam)
CSgip* pNet = (CSgip*)lParam;
while (!pNet->m_bQuitThread)
{
//发送短信
long lCount = pNet->Back_Send();
long lCount = 0;
if (pNet->m_bConnect && pNet->m_bLoginSgip == 0)
{
//发送短信
long lCount = pNet->Back_Send();
}
if (lCount > 0)
Sleep_Lu(1);
else

View File

@ -50,7 +50,7 @@ BOOL CSmsSend::OnInitDialog()
m_strMobile=_T("13922455188");
m_strMsg=_T("测试短信,祝你工作顺利。此短信免费,不用回复,如果打扰,请见谅![广州首易]");
m_strMsg=_T("【广州首易】本次操作验证码是7236235分钟有效如非本人操作请忽略。");
UpdateData(false);

View File

@ -131,7 +131,8 @@ typedef struct _MobileCom_Head
long lSendFCS;
long lReport;
long lDelay;
TCHAR szWindow[128];
TCHAR szWindow[126];
BOOL bVerifySignature;
BOOL bMainReSend;
BOOL bAllNum;
BOOL bCheckCM;
@ -342,6 +343,7 @@ typedef struct _FXSend_MT
BOOL bLongSms;
long lLongSmsRand;
BOOL bOnlySubmitMmsFile;
CString strSignature;
}FXSend_MT;
typedef CList<FXSend_MT , FXSend_MT&> CFXSend_MT;

View File

@ -64,6 +64,8 @@
#define IDC_EXCM 1028
#define IDC_CHECKCM 1029
#define IDC_SUBNUM 1030
#define IDC_CHECKCM2 1030
#define IDC_VERIFYSIGNNATURE 1030
#define IDC_CMPP 1031
#define IDC_CMPP_EXCHANGENUM 1032
#define IDC_CMPP_PORT 1033