📄 sgippdu.cpp
字号:
TCharbuf[i-pos]=*newTempPtr++;
if( (halfChinese%2)==0 )//对汉字每两个字节算一个字
iCounter++;
i++;
}
if (halfChinese%2==1){
TCharbuf[i-pos-1]='\0';
back=-1;
}
else{
TCharbuf[i-pos]='\0';
back=0;
}
CString tt;
tt.Format("%s",TCharbuf);
delete m_newBuffer;
back = tt.GetLength();
return tt;
}
BOOL AnalyseMessage(CString *strSrc, CString *strDest)
{
CString sSrcMsg,sDestMsg;
int iDesStrLenght,iPos,iCounter;//iMsgLength,
sSrcMsg = *strSrc;
if(sSrcMsg.IsEmpty())
return false;
if( GetWorsNumOfStr(sSrcMsg) > SHORT_MESSAGE_SPLIT_LENGTH){
sDestMsg = GetLeftTChar(sSrcMsg,SHORT_MESSAGE_SPLIT_LENGTH,0,iDesStrLenght);
iPos=sDestMsg.GetLength();
if( !IsDigital( sSrcMsg.GetAt(iPos) ) ){//当第二段的第一个字符不为数字时,
*strDest = sDestMsg ; // 说明没有把一个数字截为两段
*strSrc = sSrcMsg.Mid(iDesStrLenght); //sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack);
return true;
}
//当第二段的第一个字符为数字时,检查sDestMsg的最后一个字符是否
iPos=sDestMsg.GetLength()-1;
iCounter=0;
while( IsDigital( sDestMsg.GetAt(iPos) ) ){
iCounter++;
iPos--;
if(iPos<0) break;
}
if(iPos<0){//当分解出的第一段sDestMsg全为数字时
*strDest = sDestMsg;
*strSrc = sSrcMsg.Mid(iDesStrLenght);//sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack);
}
else{//当分解出的第一段sDestMsg 不全为数字时
*strDest = sDestMsg.Mid(0,iPos+1);
*strSrc = sSrcMsg.Mid(iDesStrLenght-iCounter);// sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack-iCounter);
}
}
else{
*strDest = sSrcMsg;
*strSrc = "";
}
return true;
}
int GetWorsNumOfStr(CString strMsg)
{
//把字母数字空格等单字节的字符当作双字节,一个汉字为双字节,因此这里定义两个字节为一个汉字
int iStrLength = strMsg.GetLength();
char *m_newBuffer = new char [iStrLength];
LPSTR newTempPtr = m_newBuffer;
unsigned short halfChinese=0;
int iNumOfWords = 0;
int iPos=0;
while( iPos<iStrLength ){
*newTempPtr = strMsg.GetAt(iPos);
//大于0xa1的字节为汉字字节
if((unsigned char)*newTempPtr >= 0xa1)
halfChinese++;
if( (halfChinese%2)==0 )//对汉字每两个字节算一个字
iNumOfWords++;
iPos++;
}
delete m_newBuffer;
return iNumOfWords;
}
BOOL IncludeChinese(CString strMsg)
{
int iStrLength = strMsg.GetLength();
char *m_newBuffer = new char [iStrLength];
LPSTR newTempPtr = m_newBuffer;
BOOL bIncludeChinese = false;
unsigned short halfChinese=0;
int iNumOfWords = 0;
int iPos=0;
while( iPos<iStrLength ){
*newTempPtr = strMsg.GetAt(iPos);
if((unsigned char)*newTempPtr >= 0xa1){//大于0xa1的字节为汉字字节
bIncludeChinese = true ;
break;
}
iPos++;
}
delete m_newBuffer;
return bIncludeChinese;
}
BOOL AnalyseNoChineseMessage(CString *strSrc, CString *strDest)
{
CString sSrcMsg,sDestMsg;
int iDesStrLenght,iPos,iCounter,iMsgLength;//iMsgLength,
sSrcMsg = *strSrc;
if(sSrcMsg.IsEmpty())
return false;
iMsgLength = SHORT_MESSAGE_SPLIT_LENGTH*2;//一个汉字两个字节
if( sSrcMsg.GetLength() > iMsgLength ){
sDestMsg = sSrcMsg.Left(iMsgLength);
iDesStrLenght = sDestMsg.GetLength();
iPos=sDestMsg.GetLength();
if( !IsDigital( sSrcMsg.GetAt(iPos) ) ){//当第二段的第一个字符不为数字时,
*strDest = sDestMsg ; // 说明没有把一个数字截为两段
*strSrc = sSrcMsg.Mid(iPos); //sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack);
return true;
}
//当第二段的第一个字符为数字时,检查sDestMsg的最后一个字符是否
iPos=iDesStrLenght-1;
iCounter=0;
while( IsDigital( sDestMsg.GetAt(iPos) ) ){
iCounter++;
iPos--;
if(iPos<0) break;
}
if(iPos<0){//当分解出的第一段sDestMsg全为数字时
*strDest = sDestMsg;
*strSrc = sSrcMsg.Mid(iDesStrLenght);//sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack);
}
else{//当分解出的第一段sDestMsg 不全为数字时
*strDest = sDestMsg.Mid(0,iPos+1);
*strSrc = sSrcMsg.Mid(iDesStrLenght-iCounter);// sSrcMsg.Mid(SHORT_MESSAGE_SPLIT_LENGTH+iBack-iCounter);
}
}
else{
*strDest = sSrcMsg;
*strSrc = "";
}
return true;
}
CString GetLeftTChar(CString strSrc, int iWordsNum, int iStartPos, int &iDestStrLength)
{
//把字母数字空格等单字节的字符当作双字节,一个汉字为双字节,因此这里定义两个字节为一个汉字
long lMsgLength = strSrc.GetLength();
CString NullStr("") ;
if (!lMsgLength || iStartPos>lMsgLength || iStartPos<0) return NullStr;//当源字串为空或起始位置非法时,返回空串
char *m_newBuffer = new char [lMsgLength];////////
LPSTR newTempPtr = m_newBuffer;
int iCounter;
char TCharbuf[255];
//以防止将一半汉字分为两行
unsigned short halfChinese=0;
int i=iStartPos;
iCounter = 0 ;
while(i<lMsgLength && iCounter<iWordsNum){
*newTempPtr = strSrc.GetAt(i);
//大于0xa1的字节为汉字字节
if((unsigned char)*newTempPtr >= 0xa1)
halfChinese++;
TCharbuf[i-iStartPos]=*newTempPtr++;
if( (halfChinese%2)==0 )//对汉字每两个字节算一个字
iCounter++;
i++;
}
if (halfChinese%2==1)
TCharbuf[i-iStartPos-1]='\0';
else
TCharbuf[i-iStartPos]='\0';
CString strResult;
strResult.Format("%s",TCharbuf);
delete m_newBuffer;
iDestStrLength = strResult.GetLength();
return strResult;
}
int ReceivePdu(CTcpAsyncSocket* pstSocket,char *szRecvBuf,int nMaxLen)
{
int nBytesThisTime;
time_t stOldTime = time(NULL);
time_t stCurTime;
int nLen = pstSocket->Receive(szRecvBuf,4);
if(nLen <4 )
return 0;
int nPduLen=ntohl(*((int*)szRecvBuf));
if(nPduLen > nMaxLen)
return 0;
while (nLen<nPduLen)
{
nBytesThisTime = pstSocket->Receive(szRecvBuf+nLen,nPduLen-nLen);
if(nBytesThisTime <0)
return 0;
nLen+=nBytesThisTime;
stCurTime = time(NULL);
if(abs(difftime(stCurTime,stOldTime)) >1)
return 0;
}
return nPduLen;
}
void GetIpAddr(CTcpAsyncSocket* pstSocket,char* szIpAddr)
{
struct sockaddr_in stSockAddr;
int nNameLen=sizeof(struct sockaddr_in);
getpeername (pstSocket->m_hSocket,(struct sockaddr *)&stSockAddr,&nNameLen);
sprintf(szIpAddr,"%d.%d.%d.%d",
stSockAddr.sin_addr.S_un.S_un_b.s_b1,stSockAddr.sin_addr.S_un.S_un_b.s_b2,
stSockAddr.sin_addr.S_un.S_un_b.s_b3,stSockAddr.sin_addr.S_un.S_un_b.s_b4);
}
void LogFile(const char* szMsg)
{
FILE* fp;
CTime stTime=CTime::GetCurrentTime();
fp = fopen(SGIP_LOG_FILE,"a+");
fprintf(fp,"[%d-%d %d:%d:%d]%s\n",stTime.GetMonth(),stTime.GetDay(),stTime.GetHour(),stTime.GetMinute(),stTime.GetSecond(),szMsg);
fclose(fp);
}
void LogTPLSFile(const char *szMsg)
{
FILE* fp;
CTime stTime=CTime::GetCurrentTime();
fp = fopen(TPLS_LOG_FILE,"a+");
fprintf(fp,"[%d-%d %d:%d:%d]%s\n",stTime.GetMonth(),stTime.GetDay(),stTime.GetHour(),stTime.GetMinute(),stTime.GetSecond(),szMsg);
fclose(fp);
}
// add by ycf 20020825
CString TrimStr(CString strSrc)
{
strSrc.TrimLeft();
strSrc.TrimRight();
return strSrc;
}
int UnicodeToAnsi(char *szSourceCode, int nSourceLen, char *szDestCode)
{
int size;
unsigned short* pSrc=(unsigned short*)szSourceCode;
unsigned short* p=pSrc;
BYTE cchUnicode=nSourceLen/sizeof(wchar_t);
//first network byte order to host byte order
for (int i=0;i<cchUnicode;i++)
{
*p=ntohs(*p);
p++;
}
//then unicode to mbcs code,that we normally use
size=::WideCharToMultiByte(936,0,(wchar_t*)pSrc,cchUnicode,NULL,0,NULL,NULL);
::WideCharToMultiByte(936,0,(wchar_t*)pSrc,cchUnicode,szDestCode,size,NULL,NULL);
szDestCode[size]='\0';
return size;
}
BOOL CSGipPdu::SubmitSingle(const char *szUserNumber, const char *szChargeNumber,const char* szSender,const unsigned char * bData,UINT nLength, const char *szServiceType,const char* szLinkID, char cFeeType, const char *szFeeValue, const char *szGivenValue, const char *szScheduleTime, char cMOrelatetoMTFlag,char cMessageCoding,int iTP_pid,int iTP_udhi,int iReportFlag,int iPriority,int iExpireTimeSpan)
{
//图片铃声
SSGipSubmitSingle stSubmit;
if(nLength>MAX_MESSAGE_LENGTH || bData==NULL) return FALSE;
/* //modify by ycf 20021009
if(iReportFlag<0 || iReportFlag>2)
{
iReportFlag=0;
}
*/
m_nTotalLen = PDU_HEADER_SIZE + sizeof(SSGipSubmitSingle) + nLength - MAX_MESSAGE_LENGTH ;
PacketHeader(SGIP_SUBMIT,m_nTotalLen);
memset(&stSubmit,'\0',sizeof(SSGipSubmitSingle));
strcpy(stSubmit.szSPNumber,szSender); //SP的接入号码//m_strSPNumber
stSubmit.szSPNumber[21]='\0';
strncpy(stSubmit.szChargeNumber,szChargeNumber,21); //付费号码,手机号码前加“86”国别标志。若为空,则该条消息的费用由
//UserNumber代表的用户支付,如果为全零字符串“000000000000000000000”,则费用由SP支付。
stSubmit.cUserCount =1; //接收短消息的手机数量(1--100)
strncpy(stSubmit.szUserNumber,szUserNumber,21); //接收短消息的手机号码,手机号码前加“86”
strncpy(stSubmit.szCorpId,m_strCorpId,5); //企业代码(0-99999)
strncpy(stSubmit.szServiceType,szServiceType,10); //业务代码,由SP定义
strncpy(stSubmit.szReserve,szLinkID,8); //MO和MT之间一一对应的LinkID
stSubmit.cFeeType = cFeeType; //计费类型
strncpy(stSubmit.szFeeValue,szFeeValue,6); //该条短消息的收费值,单位为分,由SP定义,对于包月制收费的用户,该值为月租费的值(范围0-99999)
strncpy(stSubmit.szGivenValue,szGivenValue,6); //赠送用户的话费,单位为分,由SP定义,特指由SP向用户发送广告时的赠送话费
stSubmit.cAgentFlag = 0; //代收费标志,0:应收;1:实收
stSubmit.cMorelatetoMTFlag = cMOrelatetoMTFlag; //引起MT消息的原因 0-MO点播引起的第一条MT消息;
//1-MO点播引起的第一条MT消息;2-非MO点播引起的MT消息;3-系统反馈引起的MT消息
stSubmit.cPriority = iPriority; //优先级0-9从低到高,默认为0
if(szScheduleTime != NULL && strlen(szScheduleTime)>0)
{
char szTime[20];
sprintf(szTime,"%s032+",szScheduleTime);
strncpy(stSubmit.szScheduleTime,szTime,16); //短消息定时发送的时间,如果为空,表示立刻发送该短消息。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
}
stSubmit.cReportFlag =iReportFlag; /* 状态报告标记
0-该条消息只有最后出错时要返回状态报告
1-该条消息无论最后是否成功都要返回状态报告
2-该条消息不需要返回状态报告
其它-保留
缺省设置为0
*/
stSubmit.cTP_pid = iTP_pid; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
stSubmit.cTP_udhi =iTP_udhi; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
stSubmit.cMessageCoding = cMessageCoding ; //0:ASCII 3:写卡 4:二进制 8:UCS2 15:GBK
stSubmit.cMessageType = 0; //信息类型:0-短消息信息;其它:待定
stSubmit.nMessageLength = htonl(nLength); //短消息的长度
//------------------------------------------------------------------------------
//add by gyh 2003-7-11
if( iExpireTimeSpan > 0 ){
CTime tCurTime ;
tCurTime = CTime::GetCurrentTime() ;
CTime t ;
CTimeSpan ts( iExpireTimeSpan ); // seconds
t = tCurTime + ts ;
char szTime[20] ;
int iYear = t.GetYear() %100 ;
sprintf(szTime,"%02d%02d%02d%02d%02d%02d032+",iYear,t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond() );
strncpy(stSubmit.szExpireTime,szTime,16); //短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。
//时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
}
//------------------------------------------------------------------------------
memcpy(stSubmit.szMessageContent,bData,nLength);
memcpy(m_szBuffer + PDU_HEADER_SIZE ,&stSubmit,m_nTotalLen - PDU_HEADER_SIZE);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -