📄 cmpp.cpp
字号:
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Fmt = m_bMsgCoding;
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_src, m_szSPID);//信息内容来源(SP_ID)
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.FeeType, m_szFeeType);//资费类别
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.FeeCode, m_szFeeValue);//资费代码(以分为单位)
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Valid_Time, m_szExpireTime);//存活有效期
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.At_Time, m_szScheduleTime);//定时发送时间
strcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Src_terminal_id, m_szSPNum);//源终端MSISDN号码
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.DestUsr_tl = 0;
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length = (unsigned char)m_lMsgContentLen;
if(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length)
{
if(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length > MAX_LEN_CONTENT)
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length = MAX_LEN_CONTENT;
memcpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Content,
m_BMsgContent,
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length);
}
else
{
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length =
strlen((char *)m_sSMBuf[m_lBufIdx4MulSM]
.sCmppMsg.uMsgBody.sMsgSubmit.Msg_Content);
if(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length > MAX_LEN_CONTENT)
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Msg_Length = MAX_LEN_CONTENT;
strncpy((char *)m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg
.uMsgBody.sMsgSubmit.Msg_Content,
(char *)m_BMsgContent, MAX_LEN_CONTENT);
}
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.sMsgHead
.Command_ID = htonl(CMPP_SUBMIT);
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.sMsgHead
.Sequence_ID = htonl(++m_dwSequenceNO);
m_sSMBuf[m_lBufIdx4MulSM].bFlag = BUF_PENDING;
}
}
m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody.sMsgSubmit.DestUsr_tl++;
//OK!下面代码行:strncpy(..)将要把一个手机号码放入包中,在放入之前,加上前缀
char szMobileIDWithPreFix[21 * 2 + 1]; //加上前缀(如果需要)后的手机号码
AddPreFix(pcPos, m_szMobileIDFix, szMobileIDWithPreFix);
if(strlen(szMobileIDWithPreFix) > 21)
{
return false;
}
strncpy(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.Dest_terminal_id + (DWORD)(MAX_LEN_MOBILE_ID + 1)
* (m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.DestUsr_tl - 1),
szMobileIDWithPreFix, MAX_LEN_MOBILE_ID);
if(m_sSMBuf[m_lBufIdx4MulSM].sCmppMsg.uMsgBody
.sMsgSubmit.DestUsr_tl >= m_lSendMaxNumPerPk)
{
m_sSMBuf[m_lBufIdx4MulSM].bFlag = BUF_READY;
//放入缓冲区的内容位置入到m_cQueueReady
m_lBufIdx4MulSM = -1;
}
pcPos = strtok(NULL, szSeps);
}
return true;
}
long CCMPP::SetMobileID(BSTR newVal)
{
USES_CONVERSION;
strncpy(m_szMobileID, W2A(newVal), MAX_BUF_LEN_MOBILE_ID);
return ERR_OK;
}
long CCMPP::SetMsgContent(VARIANT newVal)
{
if(newVal.vt & VT_UI1 && newVal.vt & VT_ARRAY)
{
unsigned int i;
for(i = newVal.parray->rgsabound->lLbound; i < ((MAX_BUF_LEN_CONTENT > newVal.parray->rgsabound->cElements)?newVal.parray->rgsabound->cElements:MAX_BUF_LEN_CONTENT); i++)
{
m_BMsgContent[i] = ((BYTE*)((newVal.vt & VT_BYREF)?(*newVal.pparray)->pvData:newVal.parray->pvData))[i];
}
m_lMsgContentLen = i;
}
if(newVal.vt & VT_BSTR)
{
USES_CONVERSION;
strncpy((char *)m_BMsgContent,
W2A((newVal.vt & VT_BYREF)?*newVal.pbstrVal:newVal.bstrVal),
MAX_BUF_LEN_CONTENT);
m_lMsgContentLen = strlen((char *)m_BMsgContent);
}
return ERR_OK;
}
long CCMPP::Submit(BSTR bStrMobileID, VARIANT *pMsgContent)
{
long plError = ERR_OK;
if(!m_bIsBinded)
{
plError = ERR_BIND_FAIL;
goto SUBMIT_EXIT;
}
if(bStrMobileID)
{
SetMobileID(bStrMobileID);
if(pMsgContent->vt != VT_ERROR)
{
//单条发送
SetMsgContent(*pMsgContent);
if(!AddMobileID(bStrMobileID))
{
plError = ERR_BUF_FULL;
goto SUBMIT_EXIT;
}
if(m_lBufIdx4MulSM >= 0)
{
m_sSMBuf[m_lBufIdx4MulSM].bFlag = BUF_READY;
//放入缓冲区的内容位置入到m_cQueueReady
m_lBufIdx4MulSM = -1;
}
}
else
{
//继续多条发送
if(!AddMobileID(bStrMobileID))
{
plError = ERR_BUF_FULL;
goto SUBMIT_EXIT;
}
}
}
else
{
//结束多条发送
if(m_lBufIdx4MulSM >= 0)
{
m_sSMBuf[m_lBufIdx4MulSM].bFlag = BUF_READY;
//放入缓冲区的内容位置入到m_cQueueReady
m_lBufIdx4MulSM = -1;
}
if(pMsgContent->vt != VT_ERROR)
{
//开始多条发送
SetMsgContent(*pMsgContent);
}
}
SUBMIT_EXIT:
return ERR_OK;
}
void CCMPP::SetPara(eParaType eInParaType, void * newVal)
{
switch(eInParaType)
{
case SendMaxNumPerPk:
if(*((long *)newVal) > 0 && *((long *)newVal) <= MAX_DEST_USR)
m_lSendMaxNumPerPk = *((long *)newVal);
break;
case Timeout4Connect:
if(*((long *)newVal) >= 0 && *((long *)newVal) <= MAX_TIMEOUT)
m_lTimeout4Connect = *((long *)newVal);
break;
case Timeout4Recv:
if(*((long *)newVal) >= 0 && *((long *)newVal) <= MAX_TIMEOUT)
m_lTimeout4Recv = *((long *)newVal);
break;
case PauseTime4Recv:
if(*((long *)newVal) >= 0 && *((long *)newVal) <= MAX_TIMEOUT)
m_lPauseTime4Recv = *((long *)newVal);
break;
case PauseTime4Stop:
if(*((long *)newVal) >= 0 && *((long *)newVal) <= MAX_TIMEOUT)
m_lPauseTime4Stop = *((long *)newVal);
break;
case SendIntervalTime:
if(*((long *)newVal) >= 0 && *((long *)newVal) <= MAX_TIMEOUT)
m_lSendIntervalTime = *((long *)newVal);
break;
case Timeout4Resp:
if(abs(*((long *)newVal)) <= MAX_TIMEOUT)
m_lTimeout4Resp = *((long *)newVal);
break;
case ExpireTime:
{
USES_CONVERSION;
strcpy(m_szExpireTime, W2A((BSTR)newVal));
if(CheckTime(m_szExpireTime))
{
//strcat(m_szExpireTime, "032+");
}
else
m_szExpireTime[0] = 0;
break;
}
case FeeMobileID:
{
USES_CONVERSION;
strncpy(m_szFeeMobileID, W2A((BSTR)newVal), MAX_LEN_MOBILE_ID);
break;
}
case FeeType:
{
sprintf(m_szFeeType, "%02d", *((BYTE *)newVal));
break;
}
case FeeUserType:
{
m_bFeeUserType = *((BYTE *)newVal);
break;
}
case FeeValue:
{
sprintf(m_szFeeValue, "%d", *((long *)newVal));
break;
}
case MsgCoding:
{
m_bMsgCoding = *(BYTE *)newVal;
break;
}
case MobileIDFix:
{
USES_CONVERSION;
char *pszNewVal = W2A((BSTR)newVal);
if(strlen(pszNewVal) >= sizeof(m_szMobileIDFix))
{//过长
printf("设置MobileIDFix属性的字符串过长!");
}
strcpy(this->m_szMobileIDFix, pszNewVal);
}
case Priority:
{
m_bPriority = *(BYTE *)newVal;
break;
}
case RegDeliveryFlag:
{
m_bRegDeliveryFlag = *(BYTE *)newVal;
break;
}
case Reserve:
{
USES_CONVERSION;
char *pszVal = W2A((BSTR)newVal);
if(strlen(pszVal) > 8)
{
printf("给Reserve属性所赋的字符串超过8个字节长!");
}
strcpy(this->m_szReserve, pszVal);
break;
}
case ScheduleTime:
{
USES_CONVERSION;
strcpy(m_szScheduleTime, W2A((BSTR)newVal));
if(!CheckTime(m_szScheduleTime))
{
m_szScheduleTime[0] = 0;
}
break;
}
case SeviceType:
{
USES_CONVERSION;
strncpy(m_szServiceType, W2A((BSTR)newVal), 10);
break;
}
case SMCID:
{
m_dwSMCID = *(long *)newVal;
break;
}
case SPID:
{
USES_CONVERSION;
strncpy(m_szSPID, W2A((BSTR)newVal), 6);
break;
}
case SPNum:
{
USES_CONVERSION;
strncpy(m_szSPNum, W2A((BSTR)newVal), MAX_LEN_MOBILE_ID);
break;
}
case TPpid:
{
m_bTPpid = *(BYTE *)newVal;
break;
}
case TPudhi:
{
m_bTPudhi = *(BYTE *)newVal;
break;
}
case Version:
{
m_bVersion = *(BYTE *)newVal;
break;
}
}
return;//ERR_OK;
}
long CCMPP::Query(long lDateTime, BSTR bStrServiceCode)
{
DWORD dwRet;
long plError = ERR_OK;
USES_CONVERSION;
if(!m_bIsBinded)
{
plError = ERR_BIND_FAIL;
goto QUERY_EXIT;
}
BZERO(m_sCmppMsg);
m_sCmppMsg.sMsgHead.Total_Length = htonl(sizeof(_CMPP_HEAD)
+ sizeof(_CMPP_QUERY));
m_sCmppMsg.sMsgHead.Command_ID = htonl(CMPP_QUERY);
m_sCmppMsg.sMsgHead.Sequence_ID = htonl(++m_dwSequenceNO);
sprintf(m_sCmppMsg.uMsgBody.sMsgQuery.szTime,
"%8d", lDateTime);
if(bStrServiceCode)
{
m_sCmppMsg.uMsgBody.sMsgQuery.bQueryType = 1;
strncpy(m_sCmppMsg.uMsgBody.sMsgQuery.szQueryCode,
W2A(bStrServiceCode), 10);
}
fd_set sFDS4Write;
FD_ZERO(&sFDS4Write);
FD_SET(m_sSocket4MT, &sFDS4Write);
dwRet = select(0, NULL, &sFDS4Write, NULL, NULL);
if(dwRet == SOCKET_ERROR)
{
m_dwLastErr4Sys = GetLastError();
goto QUERY_EXIT;
}
if(dwRet == 0 || !FD_ISSET(m_sSocket4MT, &sFDS4Write))
{
goto QUERY_EXIT;
}
WSASetEvent(m_hEvent4Socket);
dwRet = send(m_sSocket4MT, (char *)&m_sCmppMsg,
ntohl(m_sCmppMsg.sMsgHead.Total_Length), 0);
WSAResetEvent(m_hEvent4Socket);
if(dwRet == SOCKET_ERROR)
{
m_dwLastErr4Sys = GetLastError();
plError = ERR_SOCK_S_TIMEOUT;
goto QUERY_EXIT;
}
if(dwRet != (sizeof(_CMPP_HEAD) + sizeof(_CMPP_QUERY)))
{
plError = ERR_SOCK_S_FAIL;
goto QUERY_EXIT;
}
QUERY_EXIT:
return plError;
}
long CCMPP::Unbind()
{
DWORD dwRet;
long plError = ERR_OK;
if(!m_bIsBinded)return plError;
//#ifndef _DEBUG_FILE
BZERO(m_sCmppMsg);
m_sCmppMsg.sMsgHead.Total_Length = htonl(sizeof(_CMPP_HEAD));
m_sCmppMsg.sMsgHead.Command_ID = htonl(CMPP_TERMINATE);
m_sCmppMsg.sMsgHead.Sequence_ID = htonl(++m_dwSequenceNO);
fd_set sFDS4Write;
FD_ZERO(&sFDS4Write);
FD_SET(m_sSocket4MT, &sFDS4Write);
m_sTimeval4Timeout.tv_sec = m_lTimeout4Connect / 1000000;
m_sTimeval4Timeout.tv_usec = m_lTimeout4Connect % 1000000;
dwRet = select(0, NULL, &sFDS4Write, NULL, &m_sTimeval4Timeout);
if(dwRet == SOCKET_ERROR)
{
m_dwLastErr4Sys = GetLastError();
plError = ERR_SOCK_SEL_FAIL;
goto TERMINATE_EXIT;
}
if(dwRet == 0 || !FD_ISSET(m_sSocket4MT, &sFDS4Write))
{
plError = ERR_SOCK_S_TIMEOUT;
goto TERMINATE_EXIT;
}
WSASetEvent(m_hEvent4Socket);
send(m_sSocket4MT, (char *)&m_sCmppMsg,
ntohl(m_sCmppMsg.sMsgHead.Total_Length), 0);
WSAResetEvent(m_hEvent4Socket);
m_bIsUnbind = true;
TERMINATE_EXIT:
//#endif
Stop();
return plError;
}
long CCMPP::Active()
{
DWORD dwRet;
long plError = ERR_OK;
if(!m_bIsBinded)
{
plError = ERR_BIND_FAIL;
return plError;
}
//#ifndef _DEBUG_FILE
BZERO(m_sCmppMsg);
m_sCmppMsg.sMsgHead.Total_Length = htonl(sizeof(_CMPP_HEAD));
m_sCmppMsg.sMsgHead.Command_ID = htonl(CMPP_ACTIVE);
m_sCmppMsg.sMsgHead.Sequence_ID = htonl(++m_dwSequenceNO);
fd_set sFDS4Write;
FD_ZERO(&sFDS4Write);
FD_SET(m_sSocket4MT, &sFDS4Write);
m_sTimeval4Timeout.tv_sec = m_lTimeout4Connect / 1000000;
m_sTimeval4Timeout.tv_usec = m_lTimeout4Connect % 1000000;
dwRet = select(0, NULL, &sFDS4Write, NULL, &m_sTimeval4Timeout);
if(dwRet == SOCKET_ERROR)
{
m_dwLastErr4Sys = GetLastError();
plError = ERR_SOCK_SEL_FAIL;
goto ACTIVE_EXIT;
}
if(dwRet == 0 || !FD_ISSET(m_sSocket4MT, &sFDS4Write))
{
plError = ERR_SOCK_S_TIMEOUT;
goto ACTIVE_EXIT;
}
WSASetEvent(m_hEvent4Socket);
send(m_sSocket4MT, (char *)&m_sCmppMsg,
ntohl(m_sCmppMsg.sMsgHead.Total_Length), 0);
WSAResetEvent(m_hEvent4Socket);
return plError;
ACTIVE_EXIT:
Stop();
return plError;
}
void main()
{
/* int nTemp1,nTemp2;
int i;
nTemp1 = sizeof(_CMPP_BODY);
nTemp2 = sizeof(_CMPP);
i = sizeof(int);*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -