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

📄 monitor.c

📁 UNIX/LINUX平台下面SMS网管原代码
💻 C
字号:
# include <curses.h># include <string.h># include <stdio.h># include <sys/types.h># include <sys/ipc.h># include <sys/msg.h># include <signal.h># include <setjmp.h># include <fcntl.h># include <errno.h># include <time.h>#define Q_MONITOR	0x1130#define SUCCESS	0#define FAILURE	-1#define WARNING_PATTERN  1 #define VERSION_PATTERN  2#define BOX_PATTERN      3#define TITLE_PATTERN    4#define TEXT_PATTERN     5 #define BLACK		( short )COLOR_BLACK		#define RED			( short )COLOR_RED	#define GREEN		( short )COLOR_GREEN	#define YELLOW		( short )COLOR_YELLOW	#define BLUE		( short )COLOR_BLUE	#define MAGENTA		( short )COLOR_MAGENTA	#define CYAN		( short )COLOR_CYAN	#define WHITE		( short )COLOR_WHITE static int   _nMonQueueKey, _mon_msgid;static char  _sVersion[80];static void  Leave_mon();static WINDOW  *win_frame;static WINDOW  *win_mon;typedef struct pp{  long mtype;  long stype;  char mtext[250];} MSG_STRUCT;MSG_STRUCT _msgbuf;int HasColors = TRUE;char Warning[] = "<ctrl+c退出>";/*14 bytes*/#define SPE_CHAR     '|'#define MAXCOL       76void get_curr_date( char *currdate) ;/*2 lines Added by ChenYu 2003/05/29*/int fd_lock;struct flock lock;FILE	*moni;/* * main() -- 主程序 */main( int argc, char **argv ){  int  num = 1;  int  result,port1;  char msg[100];  char source[200];  char TrSite[12], TrZone[12], TrCode[5], TrName[14], TrAmt[13], Account[21], TrTime[9];  char RetCode[6], CodeMsg[31];  char TrZoneName[12];  char addr[20],port[10];  char moniname[80], tmp[ 20];  if (BuildOption(argc, argv) != 0)  {      fprintf(stdout, "Usage: %s [-q (0x1130)] [-v (version)]\r\n", argv[0]);      exit(-1);  }	result=get_winmon_confg("servaddr","winmonitor.cfg",addr);	if(result<0){		perror("get moni servaddr failure !\n");		exit(1);  }	result=get_winmon_confg("servport","winmonitor.cfg",port);	if(result<0){    	perror("get moni servport failure !\n");    	exit(1);	}	port1=atoi(port);/*14 lines Added by ChenYu 2003/05/29*//*  if( (fd_lock = open( "/tmp/lockmon", O_WRONLY|O_CREAT )) < 0 )   {	  fprintf( stdout, "Open lock file error!\n" );	  exit(-1);  }  lock.l_type = F_WRLCK;  lock.l_start = 0;  lock.l_whence = SEEK_SET;  lock.l_len = 0;  if( fcntl( fd_lock, F_SETLK, &lock ) < 0 )  {	  fprintf( stdout, "Monitor is already running, it can not be started again!\n", argv[0] );	  exit(2);  }*/  /*Monitor监控日志文件初始化*/  get_curr_date( tmp) ;  sprintf(moniname,"%s/log/monitor.%s",getenv("HOME"), tmp);  if((moni=fopen(moniname,"a+")) == NULL ){		  printf("文件创建失败,请检查路径!\n");		  exit( -1 );  }  signal(SIGINT,Leave_mon);  signal(SIGCLD,SIG_IGN);  if((_mon_msgid = msgget((key_t)_nMonQueueKey, IPC_CREAT|0666)) < 0)  {    perror("Creat message queue(KEY_MON) failure !\n");	fclose( moni );    exit(1);  }  InitColorSystem();  ShowVersion();     win_frame = newwin(19, 76, 4, 2);  win_mon = newwin(15, 76, 6, 2);  scrollok(win_mon, TRUE);  CreateWindow();  while ( 1 )  {    memset((char *)&_msgbuf,0,sizeof(_msgbuf));    if (msgrcv(_mon_msgid, &_msgbuf, 200, 0L, ~IPC_NOWAIT) < 0)      continue;    memset(source, 0, sizeof(source));     memcpy(source, _msgbuf.mtext, 200);    memset(TrSite,   0,    sizeof(TrSite));    memset(TrZone,   0,    sizeof(TrZone));    memset(TrCode,   0,    sizeof(TrCode));    memset(TrName,   0,    sizeof(TrName));    memset(TrAmt,    0,    sizeof(TrAmt));    memset(Account,  0,    sizeof(Account));    memset(TrTime,   0,    sizeof(TrTime));    memset(RetCode,  0,    sizeof(RetCode));    memset(CodeMsg,  0,    sizeof(CodeMsg));    FieldVar(source, 1, SPE_CHAR, TrZone);    FieldVar(source, 2, SPE_CHAR, TrSite);    FieldVar(source, 3, SPE_CHAR, TrCode);    FieldVar(source, 4, SPE_CHAR, TrName);    FieldVar(source, 5, SPE_CHAR, TrAmt);    FieldVar(source, 6, SPE_CHAR, Account);    FieldVar(source, 7, SPE_CHAR, TrTime);    FieldVar(source, 8, SPE_CHAR, RetCode);    FieldVar(source, 9, SPE_CHAR, CodeMsg);    memset(TrZoneName, '\0', sizeof(TrZoneName));	Get_Errorinfo( atoi(RetCode) , CodeMsg);	if(Get_Tradename( atoi(TrCode ) , TrName ) != SUCCESS ) continue;/*	Get_Tradezone( atoi(TrZone ) , TrZoneName );*/    memset(msg, ' ', sizeof(msg));    TrName[ 14] = 0 ;    sprintf(msg, "%-6s %-4s %-4s %14s %10s %19s %8s %4s",         TrZone,TrSite, TrCode, TrName, TrAmt, Account, TrTime, RetCode);    msg[MAXCOL] = 0;    if ( HasColors )    {      init_pair( TEXT_PATTERN, GREEN, BLACK );      wattrset( win_mon, COLOR_PAIR( TEXT_PATTERN ) );	  wattron(win_mon,A_BOLD);    }    wprintw(win_mon, "%-.76s", msg);    wrefresh(win_mon);    mvwprintw(win_frame,17, 7, "%5d", num) ;	wattron(win_frame,A_BOLD);    mvwprintw(win_frame, 18, 6, "%-54s",  CodeMsg);	wattroff(win_frame,A_BOLD);    wrefresh(win_frame);/*发送windows监控信息*/	SendToWin(msg,addr,port1);/*写监控日志文件*/	fprintf(moni,"%s\n",msg);	fflush(moni);    num ++ ;    if (num > 99999)        num = 1;/*added for tee monitor, delete it for need*/	wrefresh(curscr);  }}CreateWindow(){  int i;    if ( HasColors )  {	   init_pair(BOX_PATTERN, GREEN, BLACK);	   attrset(COLOR_PAIR(BOX_PATTERN));  }  mvaddstr(3,0,"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");  for(i=4;i<23;++i)  {      mvaddstr(i,0,"┃");      mvaddstr(i,78,"┃");  }  mvaddstr(23,0,"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");  refresh();  if ( HasColors )  {    init_pair( TITLE_PATTERN, RED, BLUE );    wattrset( win_frame, COLOR_PAIR( TITLE_PATTERN ) );  }  if ( !HasColors ) wstandout(win_frame);  mvwprintw(win_frame,0,0,"%-.76s","城市号 渠道 交易码及名称          交易额          借方帐号     交易时间 返回");   if ( !HasColors ) wstandend(win_frame);  wrefresh(win_frame);  if ( HasColors )  {    init_pair( TITLE_PATTERN, CYAN, BLACK );    wattrset( win_frame, COLOR_PAIR( TITLE_PATTERN ) );  }  mvwprintw(win_frame,1,0,"----------------------------------------------------------------------------");  mvwprintw(win_frame,17,0,"--第【      】笔------------------------------------------------------------");  wrefresh(win_frame);  if ( HasColors )  {    init_pair( WARNING_PATTERN, YELLOW, BLACK );    wattrset( win_frame, COLOR_PAIR( WARNING_PATTERN ) );  }  mvwprintw(win_frame, 18, 0, "提示:%-55s%.14s ",  " ", Warning);  wrefresh(win_frame);} InitColorSystem( ){  initscr();  start_color();  HasColors = has_colors();   clear();}ShowVersion( ){    int VerLen, pos;    char ver[77];    char blank[81];    memset( ver, ' ', 76 );    memset( blank, ' ', 80 );    VerLen = strlen( _sVersion );	    if ( VerLen < 76 )      pos = 37 - VerLen / 2;    memcpy( ver + pos, _sVersion, VerLen );    ver[76] = 0;    blank[80] = 0;    if ( HasColors )    {      init_pair( VERSION_PATTERN, CYAN, BLUE );      attrset( COLOR_PAIR( VERSION_PATTERN ) );    }    mvaddstr(0,0,"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");    mvaddstr(1,0,"┃");    mvaddstr(1,78,"┃");	attron(A_BOLD);    mvaddstr( 1, 2, ver );	attroff(A_BOLD);    mvaddstr(2,0,"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");    if ( !HasColors ) standout();    mvaddstr(24, 1, "       ◎  包头商业银行  2005.10      服务热线:0472-96016    ◎          ");    if ( !HasColors ) standend();    refresh();    return 0;}int FieldVar(buf, fldnum, sep, dest)unsigned char *buf, sep, *dest;int fldnum;{  int i;  unsigned char *ptr = buf;  for (i=1; i < fldnum; i++)  {    if ((ptr = (unsigned char *) strchr((char *)ptr,sep)))      ptr++;    else      return(0);  }  for (i=0; (*ptr != sep) && (*ptr); i++)    *dest++ = *ptr++;  *dest = '\0';  if (*ptr != sep)    return(0);  return(i);}static  void  Leave_mon(){  char	pathname[60];  if(msgctl(_mon_msgid, IPC_RMID, (struct msqid_ds *)NULL) < 0)     perror("Remove mon_msgid queue failure ! \n");  fclose( moni );  signal(SIGCLD,SIG_DFL);  signal(SIGINT,SIG_IGN);       werase(win_mon);  delwin(win_mon);  wrefresh(win_mon);  werase(win_frame);  delwin(win_frame);  wrefresh(win_frame);  attrset(0);  clear();  refresh();  endwin();/*11 lines Added by ChenYu 2003/05/29*/  lock.l_type = F_UNLCK;  lock.l_start = 0;  lock.l_whence = SEEK_SET;  lock.l_len = 0;  if( fcntl( fd_lock, F_SETLK, &lock ) < 0 )  {	  fprintf( stdout, "fcntl UNLOCK error!\n");  	  close(fd_lock);	  exit(-1);  }  close(fd_lock);  exit(0);}/* * BuildOption() -- 检查命令参数 *   in  para -- argc: 命令参数个数 *               argv: 命令参数 *   out para -- 无 *   return   -- -1: 失败, 0: 成功 */BuildOption(int argc, char **argv){    char temp[20];    int ch, ret=-1;    extern char *optarg;    extern int  optind;    _nMonQueueKey = Q_MONITOR;    strcpy(_sVersion, "★ 包头商业银行客户服务中心前置系统实时交易监控台 ★");    while ((ch=getopt(argc, argv, "q:v:d")) != -1)    {        switch ((char)ch)        {            case 'q':                sscanf(optarg, "%hd", &_nMonQueueKey);                break;            case 'v':                sscanf(optarg, "%s", &_sVersion);                break;            case '?':                printf("Unknow option %s !\r\n", argv[optind]);        	return -1;        }    }    return 0;}int  Get_Errorinfo( int result, char *errinfo){	FILE *fp ;	long errorno ;	char notes1[ 80] ;	char notes2[ 80] ;	char str[ 256] ;	char filename[ 80];	if( result == 0 ){			strcpy( errinfo,"交易成功");			return( SUCCESS );	}	strcpy( errinfo, "未知的错误类型!") ;	//sprintf( filename, "%s/dat/resu.dat", getenv("HOME") );	sprintf( filename, "%s/dat/error.dat", getenv("HOME") );	if ( (fp=fopen( filename, "rb")) == NULL )		return( FAILURE) ;	errorno = 0 ;	memset( str, '\0', sizeof( str)) ;	memset( notes1, '\0', sizeof( notes1)) ;	memset( notes2, '\0', sizeof( notes2)) ;	while ( !feof( fp) ) {			memset( str, '\0', sizeof( str)) ;			if ( fgets( str, 256, fp) == NULL ) break ;			if ( str[ 0] == '[' || str[ 0] == '#' ) continue ;			if ( sscanf( str, "%ld %s %s\n", &errorno, notes1, notes2) != 3 )			continue ;			if ( errorno == result ) {					fclose( fp) ;					strcpy( errinfo, notes1) ;					return( SUCCESS) ;				}			errorno = 0 ;			memset( notes1, '\0', sizeof( notes1)) ;			}		fclose( fp) ;		strcpy( errinfo, "未知的错误类型!") ;		return( SUCCESS) ;}int  Get_Tradename( int TrCode, char *TrName){	FILE *fp ;	long errorno ;	char notes[ 80] ;	char str[ 256] ;	char filename[ 80];	strcpy( TrName, "未知交易") ;	if( TrCode == 1009||TrCode==9613||TrCode==9616||TrCode==9617) return( FAILURE );	sprintf( filename, "%s/dat/trade.index", getenv("HOME") );	if ( (fp=fopen( filename, "rb")) == NULL ) 		return( FAILURE) ;	errorno = 0 ;	memset( str, '\0', sizeof( str)) ;	memset( notes, '\0', sizeof( notes)) ;	while ( !feof( fp) ) {			memset( str, '\0', sizeof( str)) ;			if ( fgets( str, 256, fp) == NULL ) break ;			if ( str[ 0] == '[' || str[ 0] == '#' ) continue ;			if ( sscanf( str, "%ld %s\n", &errorno, notes) != 2 )			continue ;			if ( errorno == TrCode ) {					fclose( fp) ;					strcpy( TrName, notes) ;					return( SUCCESS) ;				}			errorno = 0 ;			memset( notes, '\0', sizeof( notes)) ;			}		fclose( fp) ;		strcpy( TrName, "未知交易") ;		return( SUCCESS) ;}int  Get_Tradezone( int TrZone, char *TrZoneName){	FILE *fp ;	long errorno ;	char notes[ 80] ;	char str[ 256] ;	char filename[ 80];	strcpy( TrZoneName, "未知城市") ;	sprintf( filename, "%s/dat/branch.info", getenv("HOME") );	if ( (fp=fopen( filename, "rb")) == NULL ) 		return( FAILURE) ;	errorno = 0 ;	memset( str, '\0', sizeof( str)) ;	memset( notes, '\0', sizeof( notes)) ;	while ( !feof( fp) ) {			memset( str, '\0', sizeof( str)) ;			if ( fgets( str, 256, fp) == NULL ) break ;			if ( str[ 0] == '[' || str[ 0] == '#' ) continue ;			if ( sscanf( str, "%ld %s	%*s\n", &errorno, notes) != 2 )			continue ;			if ( errorno == TrZone ) {					fclose( fp) ;					if( strlen( notes ) >8 ) notes[8]='\0';					strcpy( TrZoneName, notes) ;					return( SUCCESS) ;				}			errorno = 0 ;			memset( notes, '\0', sizeof( notes)) ;			}		fclose( fp) ;		strcpy( TrZoneName, "未知城市") ;		return( SUCCESS) ;}void get_curr_date( char *currdate){	struct tm *current_time, time_buf ;	time_t t1 ;	char str[ 11] ;	current_time = &time_buf ;	time( &t1) ;	current_time = localtime ( &t1) ;	memset( str, '\0', sizeof( str)) ;	sprintf( str, "%04d%02d%02d",			1900+current_time -> tm_year,			1 + current_time -> tm_mon,			current_time -> tm_mday) ;	strcpy(currdate, str) ;	return ;}

⌨️ 快捷键说明

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