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

📄 fileopr_new.cpp

📁 SMS gateway. SMS protocol for CHINA mobile, unicom, lingtong. Using mysql to exchange message.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************  FileName            : FileOpr.cpp  Description         : 文件操作类  Version             : 1.0  Date                : 2003年6月17日  Author              : 刘荣辉  Other               : ***********************************************************************/#include "FileOpr.h"//==========================================================================//==============================构造,析构函数==============================//==========================================================================FileOpr::FileOpr(){	char buf[20];	getDate(buf);	CurrentDate = atol(buf);	memset(m_szReadBuf,0,MAXARRAY*MAXBUF*sizeof(char));	m_bRead = true;	sem_init(&SemMutex,0,1);}FileOpr::~FileOpr(){	sem_destroy(&SemMutex);}//==========================================================================//=========================将接收队列单元导出到文件=========================//==========================================================================int FileOpr::RecvQ_Backup(RecvQUnit *RUnit){		char str[MAXBYTE*2];//转换后的字符串	char mem[MAXBYTE];	//存贮内存中16进制的字符串	char *pos;	int memsize = 0;	pos=mem;			//取得RUnit->Pack包的长度	int len = ntohl(*(int *)(RUnit->Pack));	//将结构体的字段值依次以16进制形式赋给mem字符串   	memcpy(pos,&RUnit->RecvTime,sizeof(RUnit->RecvTime));	memsize += sizeof(RUnit->RecvTime);	pos += sizeof(RUnit->RecvTime);	memcpy(pos,&RUnit->MsgId_Echo,sizeof(RUnit->MsgId_Echo));	memsize += sizeof(RUnit->MsgId_Echo);	pos += sizeof(RUnit->MsgId_Echo);	memcpy(pos,RUnit->Pack,len);	memsize += len ;		//将16进制的字符串mem转换为字符串(长度增加一倍)	CFunc::HexToStr(mem,memsize,str);		//printf("\nstr=%s\n",str);	if(strlen(str)!=0)		outFile << str << endl;	 //写文件	else	{		printf("\n RecvQ_Backup: The struct is null, failed!\n");		return 1;	}	return 0;}//==========================================================================//=======================将发送队列单元导出到文件===========================//==========================================================================int FileOpr::SendQ_Backup(SendQUnit *SUnit){	char str[MAXBYTE*2];  //转换后的字符串		char mem[MAXBYTE];    //存贮内存中16进制的字符串	int memsize = 0;	char *pos;	pos=mem;	//取得RUnit->Pack包的长度	int len = ntohl(*(int *)SUnit->Pack);	//将结构体的字段值依次以16进制形式赋给mem字符串	memcpy(pos,&SUnit->SrcRecvTime,sizeof(SUnit->SrcRecvTime));	memsize +=sizeof(SUnit->SrcRecvTime);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->SrcRecvTime);	memcpy(pos,&SUnit->SrcNode,sizeof(SUnit->SrcNode));	memsize +=sizeof(SUnit->SrcNode);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->SrcNode);	memcpy(pos,&SUnit->ID_Relate,sizeof(SUnit->ID_Relate));	memsize +=sizeof(SUnit->ID_Relate);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->ID_Relate);	memcpy(pos,&SUnit->SendTime,sizeof(SUnit->SendTime));	memsize +=sizeof(SUnit->SendTime);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->SendTime);	memcpy(pos,&SUnit->iResent,sizeof(SUnit->iResent));	memsize +=sizeof(SUnit->iResent);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->iResent);	memcpy(pos,&SUnit->RelayTimes,sizeof(SUnit->RelayTimes));	memsize +=sizeof(SUnit->RelayTimes);	//printf("\nmemsize=%d\n",memsize);	pos+=sizeof(SUnit->RelayTimes);	memcpy(pos,SUnit->Pack,len);	memsize += len ;	//printf("\nmemsize=%d\n",memsize);	/*printf("\n-----------\n");	for(int i=0;i<memsize;i++)		printf("%02x ",(unsigned char)mem[i]);	printf("\n-------------\n");*/	CFunc::HexToStr(mem,memsize,str);	//printf("\n%s------------\n",str);	if(strlen(str))		outFile << str << endl;	 //写文件	else	{		printf("\n SendQ_Backup: The struct is null, failed!\n");		return 1;	}	return 0;}//==========================================================================//========================从文件中导入接收队列单元==========================//==========================================================================//*GotNum为实际获得的记录行数RecvQUnit * FileOpr::RecvQ_Restore(char  *FileName, int *GotNum){	int LineNum;	//统计出的文件的行数	int ReadNum;	//实际读取的行数	char  *Mode="r";	char  *pos;	unsigned char memBuf[MAXBYTE];//转换后的16进制的字符串	char strBuf[MAXBYTE*2];		  //从文件中读取的字符串	char *UnitPointers;	//指向存放队列单元的空间	RecvQUnit *pUnit;		ifstream MyFile(FileName);	if(MyFile.fail())	{		//printf("\n Warning: Failed to open '%s'.\n",FileName);		*GotNum=0;		return (RecvQUnit *)NULL;	}	char temp;	LineNum=0;	while(!MyFile.eof())	{		MyFile.get(temp);		if(temp=='\n')			LineNum++;	}	LineNum--;	//printf("\nRecvQ_Restore LineNum=%d",LineNum);	MyFile.close();	if(!LineNum)	//文件为空则直接返回	{		*GotNum=0;		return (RecvQUnit *)NULL;	}	UnitPointers = (char *) malloc(LineNum * sizeof(RecvQUnit));//分配存放队列单元的空间		if(RWOpen(FileName,Mode))	//打开文件,文件名必须含有日期	{		printf("\n Error: Failed to open '%s'.\n",FileName);		*GotNum=-1;		return (RecvQUnit *)NULL;	}	memset(strBuf,0,sizeof(strBuf));	ReadNum=0;	//从文件中分行读取信息	while(inFile.getline(strBuf,MAXBYTE))	{		if(ReadNum>=LineNum)			break;	//防止实际读出的行数大于上面的统计值而导致内存溢出		CFunc::StrToHex(strBuf,(unsigned char *)memBuf);//将字符串转换为16进制的字符			pUnit = (RecvQUnit *)( UnitPointers + ReadNum*sizeof(RecvQUnit));//将内存块转换为结构体类型		//printf("\n RecvQ_Restore: pUnit[%d]=%d ,sizeof(RecvQUnit)=%d. \n",ReadNum, pUnit, sizeof(RecvQUnit));		ReadNum++;		//将读出的一行数据赋给结构体		pos=(char *)memBuf;		memcpy(&pUnit->RecvTime,pos,sizeof(pUnit->RecvTime));		pos+=sizeof(pUnit->RecvTime);		//printf("\npUnit->RecvTime=%d",(int)pUnit->RecvTime);		memcpy(&pUnit->MsgId_Echo,pos,sizeof(pUnit->MsgId_Echo));		pos+=sizeof(pUnit->MsgId_Echo);		//printf("\npUnit->MsgId_Echo=%lld",pUnit->MsgId_Echo);		int len = ntohl(*(int *)pos);	//取出pUnit->Pack的长度		pUnit->Pack = (char *)malloc(len);	//为数据包分配空间		memcpy(pUnit->Pack,pos,len);		memset(strBuf,0,sizeof(strBuf));	//将strBuf清空	}	//删除文件?????? 	RWClose();    *GotNum = ReadNum;	//实际获取的记录行数	return (RecvQUnit *)UnitPointers;}//==========================================================================//========================从文件中导入发送队列单元==========================//==========================================================================SendQUnit * FileOpr::SendQ_Restore(char  *FileName,int *GotNum){	int LineNum;	//统计出的文件的行数	int ReadNum;	//实际读取的行数	char  *Mode="r";	char  *pos;		unsigned char memBuf[MAXBYTE];//转换后的16进制的字符串		char strBuf[MAXBYTE*2];		  //从文件中读取的字符串	char *UnitPointers;	//指向存放队列单元的空间		ifstream MyFile(FileName);	if(MyFile.fail())	{		//printf("\n Warning: Failed to open '%s'.\n",FileName);		*GotNum=0;		return (SendQUnit *)NULL;	}	char temp;	while(!MyFile.eof())	{		MyFile.get(temp);		if(temp=='\n')			LineNum++;	}	LineNum--;	//printf("\nSendQ_Restore LineNum=%d. ",LineNum);	MyFile.close();	if(!LineNum)	//文件为空则直接返回	{		*GotNum=0;		return (SendQUnit *)NULL;	}	UnitPointers = (char *) malloc(LineNum * sizeof(SendQUnit));//分配存放队列单元的空间		SendQUnit *pUnit;	if(RWOpen(FileName,Mode))	//打开文件,文件名必须含有日期	{		printf("\n Error: Failed to open '%s'.\n",FileName);		*GotNum=-1;		return (SendQUnit *)NULL;	}	ReadNum=0;	while(inFile.getline(strBuf,MAXBYTE))//取出一行数据	{		if(ReadNum>=LineNum)			break;	//防止实际读出的行数大于上面的统计值而导致内存溢出		CFunc::StrToHex(strBuf,memBuf);//将字符串转换为16进制的字符		pUnit = (SendQUnit *)( UnitPointers + ReadNum*sizeof(SendQUnit));		ReadNum++;		//将读出的一行数据赋给结构体		pos=(char *)memBuf;		memcpy(&pUnit->SrcRecvTime,pos,sizeof(pUnit->SrcRecvTime));		pos+=sizeof(pUnit->SrcRecvTime);		memcpy(&pUnit->SrcNode,pos,sizeof(pUnit->SrcNode));		pos+=sizeof(pUnit->SrcNode);		memcpy(&pUnit->ID_Relate,pos,sizeof(pUnit->ID_Relate));		pos+=sizeof(pUnit->ID_Relate);		memcpy(&pUnit->SendTime,pos,sizeof(pUnit->SendTime));		pos+=sizeof(pUnit->SendTime);		memcpy(&pUnit->iResent,pos,sizeof(pUnit->iResent));		pos+=sizeof(pUnit->iResent);		memcpy(&pUnit->RelayTimes,pos,sizeof(pUnit->RelayTimes));		pos+=sizeof(pUnit->RelayTimes);				int len = ntohl(*(int *)pos);		pUnit->Pack = (char *)malloc(len);	//为数据包分配空间		memcpy(pUnit->Pack,pos,len);	}	RWClose();	*GotNum = ReadNum;	//实际获取的记录行数	//删除文件?????? 	return (SendQUnit *)UnitPointers;}//==========================================================================//=========================写上端CMPP_Deliver接收日志文件===================//==========================================================================int FileOpr::WrCMPP_DeliverLog(Cmpp_Deliver_Log *pDeliverLog, char* strBuf){	    char Reserved[9];		char *pReserved;		char Content[281];		//char MsgId[17];				//获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段!		pReserved = (char *)pDeliverLog->Deliver + ntohl(pDeliverLog->Deliver->Head.Total_Length) - 8; 		memcpy(Reserved,pReserved,8);		Reserved[8]='\0';		//CFunc::HexToStr(pDeliverLog->Deliver->Msg_Id,8,MsgId);		//将消息体中的引号进行转义		mysql_escape_string(Content, pDeliverLog->Deliver->Deliver_Msg.Msg_Content, pDeliverLog->Deliver->Msg_Length);		//sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21lld%-22s%-11s%-4d%-4d%-3d%-22s%-2d%-4d%-141s%-9s%s", 		//BGNMSG, 		sprintf(strBuf, \		"Insert into CMPP_DeliverLog(RecvTime,SrcNode,Total_Length,Command_Id,Sequence_Id,Msg_Id,Dest_Id,Service_Id,TP_pid,TP_udhi,Msg_Fmt,Src_terminal_Id,Registered_Delivery,Msg_Length,Msg_Content,Reserved) values('%s','%d','%d','%d','%d','%lld','%s','%s','%d','%d','%d','%s','%d','%d','%s','%s');", \		pDeliverLog->RecvTime, \		pDeliverLog->SrcNode, \ 		ntohl(pDeliverLog->Deliver->Head.Total_Length), \ 		ntohl(pDeliverLog->Deliver->Head.Command_Id), \ 		ntohl(pDeliverLog->Deliver->Head.Sequence_Id), \		pDeliverLog->Deliver->Msg_Id, \		pDeliverLog->Deliver->Dest_Id,\ 		pDeliverLog->Deliver->Service_Id, \ 		pDeliverLog->Deliver->TP_pid, \ 		pDeliverLog->Deliver->TP_udhi, \ 		pDeliverLog->Deliver->Msg_Fmt, \ 		pDeliverLog->Deliver->Src_terminal_Id, \ 		pDeliverLog->Deliver->Registered_Delivery, \ 		pDeliverLog->Deliver->Msg_Length, \ 		Content, \ 		Reserved);		//ENDMSG);		//printf("\n FileOpr: %s. \n",strBuf);	return 0;}//==========================================================================//=======================写上端CMPP_Report接收日志文件======================//==========================================================================int FileOpr::WrCMPP_ReportLog(Cmpp_Deliver_Log *pReportLog, char* strBuf){	    char Reserved[9];		char *pReserved;		//char MsgId[17];		//char Report_MsgId[17];				//获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段!		pReserved = (char *)pReportLog->Deliver + ntohl(pReportLog->Deliver->Head.Total_Length) - 8; 		memcpy(Reserved,pReserved,8);		Reserved[8]='\0';		//CFunc::HexToStr(pReportLog->Deliver->Msg_Id,8,MsgId);		//CFunc::HexToStr(pReportLog->Deliver->Deliver_Msg.Report.Msg_ID,8,Report_MsgId); 		//sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21lld%-22s%-11s%-4d%-4d%-3d%-22s%-2d%-4d%-21lld%-8s%-11s%-11s%-22s%-11d%-9s%s", 		//BGNMSG, 		sprintf(strBuf, \		"Insert into CMPP_ReportLog(RecvTime,SrcNode,Total_Length,Command_Id,Sequence_Id,Msg_Id,Dest_Id,Service_Id,TP_pid,TP_udhi,Msg_Fmt,Src_terminal_Id,Registered_Delivery,Msg_Length,Rep_MsgId,Stat,Submit_time,Done_time,Dest_terminal_Id,SMSC_sequence,Reserved) values('%s','%d','%d','%d','%d','%lld','%s','%s','%d','%d','%d','%s','%d','%d','%lld','%s','%s','%s','%s','%d','%s');", \		pReportLog->RecvTime, \		pReportLog->SrcNode, \ 		ntohl(pReportLog->Deliver->Head.Total_Length), \ 		ntohl(pReportLog->Deliver->Head.Command_Id), \ 		ntohl(pReportLog->Deliver->Head.Sequence_Id), \		pReportLog->Deliver->Msg_Id, \ 		pReportLog->Deliver->Dest_Id,\ 		pReportLog->Deliver->Service_Id, \ 		pReportLog->Deliver->TP_pid, \ 		pReportLog->Deliver->TP_udhi, \ 		pReportLog->Deliver->Msg_Fmt, \ 		pReportLog->Deliver->Src_terminal_Id, \ 		pReportLog->Deliver->Registered_Delivery, \ 		pReportLog->Deliver->Msg_Length, \		pReportLog->Deliver->Deliver_Msg.Report.Msg_Id, \		pReportLog->Deliver->Deliver_Msg.Report.Stat, \ 		pReportLog->Deliver->Deliver_Msg.Report.Submit_time, \ 		pReportLog->Deliver->Deliver_Msg.Report.Done_time, \ 		pReportLog->Deliver->Deliver_Msg.Report.Dest_terminal_Id, \ 		pReportLog->Deliver->Deliver_Msg.Report.SMSC_sequence, \ 		Reserved);		//ENDMSG);	return 0;}//==========================================================================//========================写下端CMPP_Submit接收日志文件=====================//==========================================================================int FileOpr::WrCMPP_SubmitLog(Cmpp_Submit_Log *pSubmitLog, char* strBuf){	    char Msg_src[7];		char FeeType[3];		char FeeCode[7];		//char MsgId[17];		char Content[281];	    char Reserved[9];		char *pReserved;		//获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段!		pReserved = (char *)pSubmitLog->Submit + ntohl(pSubmitLog->Submit->Head.Total_Length) - 8; 		memcpy(Reserved,pReserved,8);		Reserved[8]='\0';		memcpy(Msg_src,pSubmitLog->Submit->Msg_src,6);		Msg_src[6]='\0';		memcpy(FeeType,pSubmitLog->Submit->FeeType,2);		FeeType[2]='\0';		memcpy(FeeCode,pSubmitLog->Submit->FeeCode,6);		FeeCode[6]='\0';		//CFunc::HexToStr(&pSubmitLog->Submit->Msg_Id,8,MsgId);		//将消息体中的引号进行转义		mysql_escape_string(Content, pSubmitLog->Submit->Msg_Content, pSubmitLog->Submit->Msg_Length); 		//sprintf(strBuf,"%s%-15s%-15s%-11d%-11d%-11d%-17s%-4d%-4d%-2d%-2d%-11s%-2d%-21s%-4d%-4d%-3d%-7s%-3s%-7s%-18s%-18s%-22s%-4d%-22s%-4d%-141s%-9s%s", 		//BGNMSG, 		sprintf(strBuf, \		"Insert into CMPP_SubmitLog(RecvTime,SrcNode,MsgId_Echo,Total_Length,Command_Id,Sequence_Id,Msg_Id,Pk_total,Pk_number,Registered_Delivery,Msg_level,Service_Id,Fee_UserType,Fee_terminal_Id,TP_pid,TP_udhi,Msg_Fmt,Msg_src,FeeType,FeeCode,ValId_Time,At_Time,Src_Id,DestUsr_tl,Dest_terminal_Id,Msg_Length,Msg_Content,Reserved) values('%s','%d','%lld','%d','%d','%d','%lld','%d','%d','%d','%d','%s','%d','%s','%d','%d','%d','%s','%s','%s','%s','%s','%s','%d','%s','%d','%s','%s');", \		pSubmitLog->RecvTime, \		pSubmitLog->SrcNode, \		pSubmitLog->MsgId_Echo, \ 		ntohl(pSubmitLog->Submit->Head.Total_Length), \ 		ntohl(pSubmitLog->Submit->Head.Command_Id), \ 		ntohl(pSubmitLog->Submit->Head.Sequence_Id), \		pSubmitLog->Submit->Msg_Id, \ 		pSubmitLog->Submit->Pk_total,\ 		pSubmitLog->Submit->Pk_number, \ 		pSubmitLog->Submit->Registered_Delivery, \ 		pSubmitLog->Submit->Msg_level, \ 		pSubmitLog->Submit->Service_Id, \ 		pSubmitLog->Submit->Fee_UserType, \ 		pSubmitLog->Submit->Fee_terminal_Id, \ 		pSubmitLog->Submit->TP_pId, \ 		pSubmitLog->Submit->TP_udhi, \ 		pSubmitLog->Submit->Msg_Fmt, \ 		Msg_src, \ 		FeeType, \ 		FeeCode, \ 		pSubmitLog->Submit->ValId_Time, \ 		pSubmitLog->Submit->At_Time, \ 		pSubmitLog->Submit->Src_Id, \ 		pSubmitLog->Submit->DestUsr_tl, \ 		pSubmitLog->Submit->Dest_terminal_Id, \ 		pSubmitLog->Submit->Msg_Length, \ 		pSubmitLog->Submit->Msg_Content, \ 		Reserved);		//ENDMSG);		//printf("\n FileOpr: %s. \n",strBuf);	return 0;}//==========================================================================//=========================写上端SMGP_Deliver接收日志文件===================//==========================================================================int FileOpr::WrSMGP_DeliverLog(Smgp_Deliver_Log *pDeliverLog, char* strBuf){		char MsgId[21];		CFunc::HexToStr(pDeliverLog->Deliver->sMsgId,10,MsgId);		sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21s%-2d%-4d%-15s%-22s%-22s%-4d%-253s%s", 		BGNMSG, \		pDeliverLog->RecvTime, \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -