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

📄 dkcj.c

📁 170话费催交系统
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
/*Dialogic includes*/
#include "srllib.h"
#include "dxxxlib.h"
#include "sctools.h"

#include "dkcj.h"

#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void time_out();
void intr_hdlr();
void Init_dbf();
void Init_sys();
void Sys_exit(int filenumber,int channum);
void Startzdsl();
int cjtime();
int cj_count();
void get_number();
int channal_work();
int Process(int eventdev,int event);
int dial_telephone(int channum);
int get_header();
int get_record(int channum);
void Play_value(char *sj_value,char *dkbj_value,char *dklx_value,char *hjje_value,int filenum,DX_IOTT *iott_value,int channum);
int Index_sj(char* sj_value,DX_IOTT *iott_time,int filenum);
int Index_value(char *sz_value,DX_IOTT *iott_value,int filenum);
void Index_sz(char* sj_value,char* dkbj_value,char* dklx_value,char* hjje_value,DX_IOTT* iott_value);
int Index_yf(char *sz_value,DX_IOTT *iott_value,int filenum);
int  myitoa(int myi,char* mya,int length);
int  myltoa(long myl,char* mya,int length);
int writelog();

void main(int argc,char* argv[])
{
    	pid_t pid;
    	char* prgnamep;
	
	prgnamep=argv[0];
	
	if (argc < 2) {
             printf(" Usage: %s [device name list]\n the device name is: C1, C2, C3 or C4\n", prgnamep);
             exit(1);
        }
        if (argc > 5) {
        	printf(" The number of device name must be equal or less than 4\n");
        	exit(1);
        }
        
        for(argnum=1;argnum<argc;argnum++) {
        	if((strcmp(argv[argnum],"C1")!=0)&&(strcmp(argv[argnum],"C2")!=0)&&(strcmp(argv[argnum],"C3")!=0)&&(strcmp(argv[argnum],"C4")!=0)) {
        		printf(" The device name must be C1, C2, C3 or C4\n");
        		exit(1);
        	}
        	strcpy(argnames[argnum-1],"dxxxB1");
        	strcat(argnames[argnum-1],argv[argnum]);
        }
        argnum=argc-1;
	
    printf("\n The Hasten Pay For Housing Of Loan v1.0\n Copyright (c) 1999 QiYan\n");
    if ((pid = fork()) > 0) {
    	//父进程
    	//sleep(3);
    	exit(0);
    }
    else if (pid==0) {    	
       sigset( SIGHUP, (void (*)()) intr_hdlr );
       sigset( SIGINT, (void (*)()) intr_hdlr );
       sigset( SIGQUIT, (void (*)()) intr_hdlr );
       sigset( SIGTERM, (void (*)()) intr_hdlr );
    
       Init_dbf();
       Init_sys();
       //signal(SIGALRM,(void (*)()) time_out);
       //alarm(1);
       Startzdsl();
       exit(0);
    }
    else
    {
    	printf(" Error forking child process.");
    	exit(1);
    }
}

void intr_hdlr()
{
	int channum;
	int filenum;
	long hookst;
	
      for(channum=0;channum<argnum;channum++){
		 if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
                       dx_stopch( dxinfo[channum].chdev , EV_SYNC );
                       while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
		 }
		 if((hookst = ATDX_HOOKST(dxinfo[channum].chdev)) == AT_FAILURE) {
		 	printf(" Get Hook state error in channal %s\n",argnames[channum]);
		 }
		 if(hookst == DX_OFFHOOK) {
		     if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
                           printf(" Set OnHook error in channal %s\n",argnames[channum]);
		     }
		 }
	         dx_close(dxinfo[channum].chdev);
	}

        for(filenum=0;filenum<MAXFILE;filenum++){
		  if(close(szfile[filenum].filehandle)==-1){
		        printf(" Close file %s error.\n",szfile[filenum].filename);
		  }
	}
	printf(" End The Hasten Pay For Housing Of Loan!\n If You Have Any Problem, Please Mail Qi_Yan@Hotmail.Com!\n");
        exit(0);
}

void Init_dbf()
{
	FILE* handle; 
        unsigned char header[32];
    
       if((handle=fopen(szdbffile,"rb"))==NULL) {
	      printf(" can't open %s file \n",szdbffile);
	      exit(1);
       } 

       if(fread(header,32,1,handle)==0) {
	      printf(" read %s file's header error \n",szdbffile);
	      fclose(handle);
	      exit(0);
       }
       
       if(header[1]<70) { 
           headermessage.year=2000+header[1];
       }
       else
       {
           headermessage.year=1900+header[1];
       }
       
       headermessage.month=header[2];
       headermessage.day=header[3];
       headermessage.wjrql=headermessage.year*10000+headermessage.month*100+headermessage.day;
       myltoa(headermessage.wjrql,headermessage.wjrqc,sizeof(headermessage.wjrqc));
       headermessage.record_number=header[4]+header[5]*256+header[6]*256*256+header[7]*256*256*256;
       headermessage.header_length=header[8]+header[9]*256;
       headermessage.record_length=header[10]+header[11]*256;
       headermessage.szdbffile=szdbffile;
       fclose(handle);
}

void Init_sys()
{
	int channum;
	int filenumber;
	char channame[20];
	int mode;
	int index;

	telecount.all_count=0;
	telecount.success_count=0;
    telecount.failure_count=0;
    telecount.success_flag=0;
     cjstate.time_state=TIME_U;
     cjstate.time_oldstate=TIME_U;

	printf(" Open The Vox File...\n");
	for(filenumber=0;filenumber<MAXFILE;filenumber++){
		  strcpy(szfile[filenumber].filename,"./vox/");
          strcat(szfile[filenumber].filename,szfilename[filenumber]);
	}

	for(filenumber=0;filenumber<MAXFILE;filenumber++){
            if (( szfile[filenumber].filehandle= open(szfile[filenumber].filename,O_RDONLY)) == -1) {
                  printf(" open %s error.\n",szfile[filenumber].filename);
				  Sys_exit(filenumber,0);
			}
	}

	printf(" Initializing Dialogic ...\n");
	
	mode = SR_POLLMODE;
        if ( sr_setparm( SRL_DEVICE, SR_MODEID, &mode ) == -1 ) {
          printf( " Unable to set to Polled Mode" );
          Sys_exit( MAXFILE,0 );
        }
	
	for(channum=0;channum<argnum;channum++){
                if((dxinfo[channum].chdev=dx_open(argnames[channum],NULL))== -1){
			 printf(" Can't opened channal %s\n",argnames[channum]);
		     Sys_exit(MAXFILE,channum);
		}

		dxinfo[channum].chdevzt=CHDEVZT_A;

             strcpy(teleinfo[channum].dkbj,"");
             strcpy(teleinfo[channum].dklx,"");
             strcpy(teleinfo[channum].hjje,"");
             strcpy(teleinfo[channum].zzrq,"");
		strcpy(teleinfo[channum].telephone,"");
		
		if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
                    dx_stopch( dxinfo[channum].chdev, EV_ASYNC );
                    while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
                }
		
		if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
			printf(" error set onhook in channal %s\n",argnames[channum]);
			Sys_exit(MAXFILE,channum+1);
		}
		
		if (dx_setevtmsk(dxinfo[channum].chdev, DM_LCREV) == -1) {
            printf(" error enable ring detection of DM_LCREV in channal %s\n",argnames[channum]);
            Sys_exit(MAXFILE,channum+1);
	        }
	        for (index=0; index<MAX_TONES; index++) {
                   dxinfo[channum].tmplts[index] = DefaultTones[index];
                }
                dxinfo[channum].callp = capDflt;

         // initialize tones for PerfectCall
         for (index = 0; index < MAX_TONES; index++) {
            dx_chgfreq(dxinfo[channum].tmplts[index].tid,
                       dxinfo[channum].tmplts[index].freq1.freq,
                       dxinfo[channum].tmplts[index].freq1.deviation,
                       dxinfo[channum].tmplts[index].freq2.freq,
                       dxinfo[channum].tmplts[index].freq2.deviation);

            dx_chgdur(dxinfo[channum].tmplts[index].tid,
                      dxinfo[channum].tmplts[index].on.time,
                      dxinfo[channum].tmplts[index].on.deviation,
                      dxinfo[channum].tmplts[index].off.time,
                      dxinfo[channum].tmplts[index].off.deviation);

            dx_chgrepcnt(dxinfo[channum].tmplts[index].tid,
                         dxinfo[channum].tmplts[index].repcnt);
         }
         if (dx_deltones(dxinfo[channum].chdev) == -1) {
            printf(" error delete tones in channal %s\n",argnames[channum]);
            Sys_exit(MAXFILE,channum+1);
         }
         if (dx_initcallp(dxinfo[channum].chdev) == -1) {
            printf(" error init callp in channal %s\n",argnames[channum]);
            Sys_exit(MAXFILE,channum+1);
         }

	}
}

void Sys_exit(int filenumber,int channum)
{
      int file_count;
      int chan_count;

      if (filenumber>0) {
           for(file_count=0;file_count<filenumber;file_count++) {
                close(szfile[file_count].filehandle);
           }
      }
      if (channum>0) {
          for(chan_count=0;chan_count<channum;chan_count++) {
               dx_close(dxinfo[chan_count].chdev);
          }
      }
      exit(1);
}

void Startzdsl()
{
	int channum;
	int evtdev,evttype;
	
	while(1){
		while(!cjtime()){
			for(channum=0;channum<argnum;channum++) {
			  if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
                             dx_stopch( dxinfo[channum].chdev, EV_SYNC );
                             while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
		
		             if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
			           printf(" error set onhook in channal %s\n", argnames[channum]);
		             }
		          }
		        }
		        printf(" The Hasten Pay Program Is Sleeping \n");
		        /*printf("the success cuijiao number is %ld , the all cuijiao number is %ld in period of %s"\n,
                           telecount.success_count,telecount.all_count,period[cjstate.time_oldstate-1]);*/
		        sleep(20);
	       }
	       printf(" The Hasten Pay Program Is Starting \n");
	       
	       while(!get_header()) {
	       	        printf(" The Hasten Pay Program Is Stoping \n");
	       	        sleep(60);
	       }
	       
	       for(channum=0;channum<argnum;channum++) {
	       	      get_number();
	       	      if(cjstate.current_number>headermessage.record_number) {
	       	      	      break;
	       	      }
	       	      if(get_record(channum) == -1) { //取得记录数据
	       	            printf(" Get the number %ld of record error in channal %s \n", cjstate.current_number, argnames[channum]);
	       	            break;
	       	      }
	       	      if(dx_sethook(dxinfo[channum].chdev,DX_OFFHOOK,EV_SYNC)==-1){			                
			    printf(" Error set offhook in channal %s \n", argnames[channum]);
			    break;
		      }
		      telecount.all_count=telecount.all_count+1;
	       	      if(dial_telephone(channum) == -1) {   //拨号
	       	            if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
			           printf(" error set onhook in channal %s\n", argnames[channum]);
		            }
		            continue;
		      }
	       	      dxinfo[channum].idlework = ID_WORK;
	       	      dxinfo[channum].chtime = 0;
	       }
	       
	       if(!channal_work()) {
	       	     printf(" The Hasten Pay Program Isn't Starting \n");
	       	     sleep(60);
	       	     continue;
	       }
	       
	       while(1) {
	       	      if((!cjtime())&&(!channal_work())) {
	       	      	        printf(" The Hasten Pay Program Is Stoping \n");
	       	      	        break;
	       	      }
	       	      if( sr_waitevt(-1) == -1) {
	       	      	  printf(" Get evt error \n The Hasten Pay Program Is Stoping \n");
	       	      	  break;
	       	      }
	       	      
	       	      evtdev = sr_getevtdev();
		      evttype = sr_getevttype();
		
		      if(Process(evtdev,evttype)!=0) {
		      	    printf(" The Hasten Pay Program Is Stoping \n");
			    break;
		      }
	      }
	      writelog();
	      //cjstate.time_oldstate=cjstate.time_state;
        }
}

int writelog()
{
	FILE* filelog; 
        char* ls_date;
	char* lp_date;
	time_t ls_t;
	int li_day;
	
	time(&ls_t);
	ls_date = ctime(&ls_t);
	
	lp_date = ls_date+8;
	ls_date[10] = '\0';
	li_day = atoi(lp_date);
		
	if((li_day=7)||(li_day=14)||(li_day=20)) { 
             if((filelog=fopen(logfile,"at"))==NULL) {
	         printf(" can't open %s file \n",logfile);
	         return(-1);
	     }
             fprintf(filelog,"The %s period of success cuijiao number is %ld, the %s period of all cuijiao number is %ld.\n",
                 period[cjstate.time_state-1],telecount.success_count,period[cjstate.time_state-1],telecount.all_count);
             fclose(filelog);

⌨️ 快捷键说明

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