⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sgippdu.cpp

📁 一个用vc开发的Sgip通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -