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

📄 cisrecv.cpp

📁 液晶电视完整代码可实现人机界面
💻 CPP
字号:
/*********************************************************************************函数说明:从mqin目录获取报文文件存数据库**版本号	|修改时间	|修改说明*v1.01	|20070717	|增加410大报文处理,超过50K做文件处理;注释重复产生序列号部分**********************************************************************************////////////////////////////////////////#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <sys/time.h>#include <dirent.h>#include <unistd.h>#include <time.h>#include "MbToCis.h"#include "CisPub.hpp"//全局变量SybServer m_clsSybServer;BepsPub sCis;//从mqin获取待处理报文int GetCisData(RECVDATA *sRecvData ,char *filename );//连接数据库int connectToDB( char *dbname , char *username , char *passwd , char *wkname){    if(!m_clsSybServer.Open(dbname,username ,passwd))    {        filelog(ERRLOG,"连接数据库[%s][%s][%s]失败!\n",dbname,username,passwd);        return -1;    }    filelog(STEP,"连接数据库[%s][%s][%s]成功!\n",dbname,username,passwd);    if(!m_clsSybServer.SetWrkDb(wkname))    {        filelog(ERRLOG,"切换数据库[%s]失败!\n" , wkname);        return -1;    }    filelog(STEP,"切换数据库[%s]成功\n" , wkname);    return 0;}//断开数据库连接int disConnectToDB(){    m_clsSybServer.Close();    filelog(STEP,"断开数据库连接!\n");    return 0;}/****************************************************************************** *函数说明:保存报文文件到数据库 * *****************************************************************************/int SaveRecvData( RECVDATA *sRecvData, char *retMsg ){	char sSqlCmd[1024*100];	char WorkDate[9];	char CmtNo[4];	int ret=0;	memset( sSqlCmd , 0 , sizeof( sSqlCmd ));	memset( CmtNo , 0 , sizeof( CmtNo ));	memset( WorkDate , 0 , sizeof( WorkDate ));	memcpy( CmtNo , sRecvData->msgid + 3 , 3);	sCis.BeginTrans();	sprintf( sSqlCmd , "insert into recv_data values(%d,'%s','%s','%s','%s','%s')",  sRecvData->dataidx,sRecvData->orgno,sRecvData->workdate,sRecvData->doflag,sRecvData->msgid , sRecvData->msgcontent);	ret = sCis.SaveCisData("recv_data",sSqlCmd,retMsg);	if( ret <= 0 )	{		printf("SaveRecvData error![%s]\n",sSqlCmd);		sCis.RollbackTrans();		return -1;	}	sCis.CommitTrans();	return 0;}int SaveDataToFile( RECVDATA *sRecvData, char *retMsg ){	return 0;}//入口void main(int argc, char* argv[]){    char Tmp[2048*1024];    //显示其版本号    if(argc == 2 && (memcmp(argv[1], "-v", 2)==0||memcmp(argv[1], "-V", 2)==0))    {        printf("System verison is: Direct CIS CISProc V1.1\n");        exit(0);    }    //使主进程成为守护进程    pid_t main_pid =0;    main_pid = fork();    if(0!= main_pid)    {        exit(0);    }    int ret;    char doflag[1+1],filename[100],filename1[100];    char CisNo[3+1];    char retMsg[255+1];    char Password[20];    RECVDATA sRecvData;    int fflag = 0;    int len = 0;    memset( doflag , 0 , sizeof( doflag));    memset( CisNo , 0 , sizeof( CisNo ));    memset( &sRecvData , 0 , sizeof( sRecvData ));    memset( retMsg , 0 , sizeof( retMsg ));    memset( Password , 0 , sizeof( Password ));    sprintf( Password , "%s", getenv("PASSWORD"));    char DBUserName[10];    memset( DBUserName , 0 , sizeof(DBUserName));    strcpy( DBUserName , getenv("DBUSERNAME"));    StrTrim(DBUserName , ' ');    if( strlen( DBUserName ) == 0 )    {	strcpy( DBUserName , "sa");    }    printf("DBUserName = [%s]\n", DBUserName );    ret = connectToDB( "SYBASE" , DBUserName , Password , "DIRWAYSDB");    if( ret != 0 )    {	filelog(ERRLOG,"[CisRecv]连接数据库失败!\n");	printf("连接数据库失败!\n");	return ;    }/*****版本授权控制    int flag = 0;    ret = sCis.CheckSerail(&flag);    if( flag != 0)    {        printf("system not permission exit!\n");	exit(0);    }*****/    while(1)    {		memset( filename , 0 , sizeof(filename));		memset( filename1 , 0 , sizeof(filename1));		memset( CisNo , 0 , sizeof(CisNo));		memset( &sRecvData , 0 , sizeof(sRecvData));		memset( Tmp , 0 , sizeof(Tmp));		//从消息中间件获取来帐报文		ret = GetCisData( &sRecvData ,filename);		if( ret < 0 )		{			printf("未发现待处理来报......\n");			sleep(5);			continue;		}		strcpy( Tmp , sRecvData.msgcontent);		//printf("Tmp[cisrecv] = [%s]\n", Tmp );		memcpy( CisNo, sRecvData.msgid+3, 3 );		switch( atoi(CisNo) )		{			case 100:			case 101://			case 411:				//报文存文件处理			sprintf(filename1 , "%s/filein/%s%08s%08d",getenv("WORKDIR"),CisNo,sRecvData.workdate,sRecvData.dataidx);				memset( sRecvData.msgcontent,0,sizeof(sRecvData.msgcontent));				memcpy( sRecvData.msgcontent,filename1,strlen(filename1));				ret = SaveRecvData( &sRecvData, retMsg );				break;			case 410:				//增加大报文文件处理//				len = strlen( sRecvData.msgcontent );				//大于50K做文件处理大小来源于CISPROC//				if (len > 1024*50)					fflag = 1;				if(fflag == 1)				{			sprintf(filename1 , "%s/filein/%s%08s%08d",getenv("WORKDIR"),CisNo,sRecvData.workdate,sRecvData.dataidx);				memset( sRecvData.msgcontent,0,sizeof(sRecvData.msgcontent));				memcpy( sRecvData.msgcontent,filename1,strlen(filename1));				sprintf( sRecvData.msgcontent, "{F:%s}", filename1 );				}				ret = SaveRecvData( &sRecvData, retMsg );				break;							case 201:			case 301:			case 302:			case 303:			case 305:			case 307:			case 308:			case 309:			case 310:			case 405:			case 406:			case 407:			case 408:			case 409:			case 412:			case 413:			case 414:				case 601:							case 402:							case 404:								//接收报文入库				ret = SaveRecvData( &sRecvData, retMsg );				break;			default:				printf( "未定义报文:[%s]\n", CisNo );				filelog( ERRLOG, "[CisRecv]接收到未定义报文:[%s]\n", CisNo );				unlink(filename);				sleep(1);				continue;		}		if( ret < 0 )		{			//修改recv_data处理状态位			strcpy( doflag, "3" );			printf("解析报文[%s]出错:%s\n", sRecvData.msgid, retMsg);			filelog(ERRLOG, "[CisRecv]解析报文[%s]出错:%s\n", sRecvData.msgid, retMsg);		}		else			strcpy( doflag, "1" );				//更改接收报文队列表报文处理状态		/*******************		ret = sCis.SetDoflag( "recv_data",&sRecvData.dataidx, doflag, retMsg );		********************/		//大报文存文件处理		if( fflag == 1 || strncmp(CisNo ,"100",3) == 0||strncmp( CisNo,"101",3) == 0 ||strncmp( CisNo,"411",3) == 0)		{			FILE *fp = NULL;			fp = fopen( filename1,"w+");			if( fp == NULL)			{				printf("Open[w] file[%s] error!\n",filename);				return ;			}			fwrite( Tmp , strlen(Tmp),1,fp);			fclose(fp);		}		//删除mqin目录下报文文件		ret = unlink(filename);		if( ret < 0 )		{			printf("更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg );			filelog(ERRLOG, "[CisRecv]更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg );		}		printf("报文[%s]处理成功!\n", CisNo);		sleep(1);//		filelog(CISPROLOG, SIGNLIMIT);		    }    return;}/****************************************************************************** *函数说明:从mqin目录获取报文文件 * *****************************************************************************/int GetCisData(RECVDATA *sRecvData ,char *filename ){	int ret = 0;	DIR *dirp = NULL;	struct dirent *filedir = NULL;	char Path[100],Tmp[1024+1];	FILE *fp = NULL;	char CmtNo[4],flag = 0;	char TmpData[2048*1024];	char retMsg[255];	char tail[1+1];	int Time;	struct stat FileStat;		memset( CmtNo , 0 ,sizeof( CmtNo ));	memset( TmpData , 0 ,sizeof( TmpData ));	memset( Path , 0 ,sizeof( Path ));	memset( tail, 0, sizeof(tail) );		sprintf( Path, "%s/mqin", getenv("WORKDIR"));	dirp = opendir( Path );	if( dirp == NULL )	{		printf("Opendir [%s] error!\n", Path );		return -1;	}	while((filedir = readdir(dirp)) != NULL) {		memset( filename , 0 , sizeof( filename));		if(  filedir->d_name[0] != '.')		{			sprintf(filename , "%s/%s",Path,filedir->d_name);			printf("+++++++++read file = [%s]\n", filename);			flag = 1;			break;		}	}	closedir(dirp);				//增加了文件修改时间判断 , 确保文件被完全写完	if( flag == 0 )	{		return -1;	} else {		flag = 0;		Time = time(NULL);		stat(filename ,&FileStat);		if( (Time - FileStat.st_mtime) < 6 )		{			printf("File[%s] may be not creat!Try....\n",filename);			return -1;		}	}		fp = fopen( filename , "r+");	if( fp == NULL )	{		printf("Open file[%s] failed!\n", filename );		return -1;	}	while(!feof(fp)) {		memset( Tmp , 0 , sizeof( Tmp));		ret = fread( Tmp , 1024 , 1 , fp);		if( ret >= 0)		{			strcat( TmpData , Tmp );		}	}	fclose(fp);	if(!sCis.MakeTrxsSerialNo(&sRecvData->dataidx,retMsg,DATAID))		return -1;		memcpy( tail, TmpData + strlen(TmpData)-1, 1 );	if( strcmp( tail, "}" ) != 0 )		strcat( TmpData, "}" );	sprintf( sRecvData->msgcontent,"%s",&TmpData[1]);//	sprintf( sRecvData->msgcontent,"%s",TmpData);//	printf("Have GetCis = [%s]\n",sRecvData->msgcontent);//	filelog("Tmpdata.log", TmpData );//	filelog("msgcon.log", sRecvData->msgcontent );	//间连报文结构:报文号为57位	//memcpy( CmtNo , sRecvData->msgcontent + 57 , 3);	//直连连报文结构:报文号为11位	memcpy( CmtNo , sRecvData->msgcontent + 11 , 3);	sprintf( sRecvData->msgid,"CIS%s", CmtNo);	printf("CmtNo = [%s]\n", CmtNo );	char *Begin = NULL;	Begin = strstr( sRecvData->msgcontent , ":30A:");	memcpy( sRecvData->workdate , Begin + 5 , 8);		Begin = NULL;	strcpy( sRecvData->doflag , "0");	Begin = strstr( sRecvData->msgcontent , ":D21:");	memcpy( sRecvData->orgno , Begin + 5 , 12);			return 0;}

⌨️ 快捷键说明

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