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

📄 pre_netw.c

📁 unix下进行电报传输的源码。采用信号灯技术避免文件冲突等等
💻 C
字号:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nfcnet.h"
int  semset(void);
int  semopena(int semset_semid,int semset_semno);
int  semopenr(int semset_semid,int semset_semno);
int  semclose(int semset_semid,int semset_semno);
void get_dt_rbmk(void);
void get_dt2(void);
void out_dt_rbmk(void);
void propro(char *buf1, char *buf2);
int fline(FILE *fp,char *buf1);
int proc1(char *buf1);
void proc2(char *buf1);
int proc3(char *ls);
void nwloginout(int mk);
int iy1,im1,id1,iy2,im2,id2;
FILE *fpmk, *fpi, *fpo1, *fpo2;
long int rb_mk;
/*
 This is the main that proprocess telegrams
 that is received from telegram office .
*/
int statusx,semid;
void main()
{ /* The file name is for TEyymmdd.TEL, PR_SORT.TMP,
     and PRyymmdd.TEL . */
  char fni[256], fno1[50];
  char buf1d[1024],bufxd[3072];
  char *buf1, *bufx;
  int i,j,k,ijk;
  semid=semset();
  printf("Semid is %d\n",semid);
  for(i=0;i<1024; i++)buf1d[i]=0;
  for(i=0;i<3072;i++)bufxd[i]=0;
  buf1=&buf1d[0];
  bufx=&bufxd[0];
  get_dt_rbmk();
  ijk=0;
  nwloginout(0); sleep(30);
  for(;;)
  { for(;;)
    { sprintf(fni,"/netware/%s.nws/%s.nwv%s/tele%02d%02d.tel",
                  P_SERVER,P_VOLUME,P_DIRECTORY,im1,id1);
      sprintf(fno1,"/nfcnet/tele/pr%02d%02d%02d.tel",iy1,im1,id1);
      if((fpi=fopen(fni,"r"))!=NULL){break;}
      fpi=fopen(fni,"a+");
      fclose(fpi);
    }
    statusx=semopena(semid,P_PR_SORT);
    fpo1=fopen(fno1,"a+");
    fpo2=fopen("/nfcnet/temp/pr_sort0.tmp","a+");
    fseek(fpi,rb_mk,SEEK_SET);
    propro(buf1,bufx);
    fclose(fpi);
    fclose(fpo1);
    fclose(fpo2);
    statusx=semclose(semid,P_PR_SORT);
    get_dt2();
    if((iy1!=iy2)||(im1!=im2)||(id1!=id2))
    { iy1=iy2; im1=im2; id1=id2; rb_mk=0;}
    out_dt_rbmk(); 
    printf("PRE_PROC Waiting for (%d) mins(%d) .\n",P_SLEEPTIME,ijk);
    ijk++;
    if(ijk==1000)ijk=0;
    sleep(P_SLEEPTIME*60);
  }
/*nwloginout(1);*/
}
/*
 To login or logout from server .
*/
void nwloginout(int mk)
/*
     mk=0    means login
     mk=1    means logout
*/
{ char logcmd[100];
  if(mk==0)
  { sprintf(logcmd,"/usr/bin/nwlogin %s/%s < /etc/rc3.d/serverpass%c",
    P_SERVER,P_USERNAME,0);
    system(logcmd);
  }
  if(mk==1)
  { sprintf(logcmd,"/usr/bin/nwlogout %s%c",P_SERVER,0);
    system(logcmd);
  }
}
/*
 To get the date and rb_mk .
*/
void get_dt_rbmk(void)
{ time_t idymd;
  struct tm cdymd;
  struct tm *cdymdp;
  cdymdp=&cdymd;
  if((fpmk=fopen("/nfcnet/sysd/pre_proc.idd","r"))!=NULL)
  { fscanf(fpmk,"%d%d%d%ld",&iy1,&im1,&id1,&rb_mk);
    fclose(fpmk); }
  else
  { time(&idymd);
    cdymdp=localtime(&idymd);
    cdymd=*cdymdp;
    iy1=cdymd.tm_year;
    im1=cdymd.tm_mon+1;
    id1=cdymd.tm_mday;
    rb_mk=0;
  }
}
/*
 To get the date .
*/
void get_dt2(void)
{ time_t idymd;
  struct tm cdymd;
  struct tm *cdymdp;
  cdymdp=&cdymd;
  time(&idymd);
  cdymdp=localtime(&idymd);
  cdymd=*cdymdp;
  iy2=cdymd.tm_year;
  im2=cdymd.tm_mon+1;
  id2=cdymd.tm_mday;
}
/*
 To write the date and rb-mk into file PRE_PROC.IDD .
*/
void out_dt_rbmk(void)
{ if((fpmk=fopen("/nfcnet/sysd/pre_proc.idd","w+"))!=NULL)
  { fprintf(fpmk,"%d %d %d %ld\n",iy1,im1,id1,rb_mk);
    fclose(fpmk);}
}
/*
 To proprocess the telegram .
*/
void propro(char *buf1, char *bufx)
{ int imk,imk1,imk2,jkx,len,i;
  char *zc3="ZCZC";
  char *zc2="ZCZC RERN";
  char *zc1="ZCZC RETV";
  char *nnn="NNN";
  char *jks,*jkl,*ls="         ";
  char sp[2]=" ";
  jkx=-1;
  do
  { imk=fline(fpi,buf1);
    imk1=proc1(buf1);
    if(imk1!=0)
    { jks=0;
      proc2(buf1);
      if(jkx==-1)
      { jks=strstr(buf1,zc1); if(jks!=0) {jks=jks+10;jkx=0;}}
      if(jkx==-1)
      { jks=strstr(buf1,zc2); if(jks!=0) {jks=jks+10;jkx=0;}}
      if(jkx==-1)
      { jks=strstr(buf1,zc3); if(jks!=0) {jks=jks+ 5;jkx=0;}}
      if((jkx==0)&&(jks!=0))
      { jkl=strstr(jks,sp);
        if(jkl!=0)
        { len=jkl-jks;
          if((len==6)||(len==7))
          { for(i=0;i<9;i++)*(ls+i)=0;
            strncpy(ls,jks,len);
            imk2=proc3(ls);
            if(imk2==-1) {jkx=-1;}
            else
            { jkx=1;
              strncpy(bufx,jks,len+1);
              *(bufx+len+1)=0;
            }
          }
          else
          {jkx=-1;}
        }
        else
        { jkx=-1;}
      }
      if((jks==0)&&(jkx==1))
      { jks=strstr(buf1,P_TELEADDR); if(jks!=0){jkx=2;jks=0;}}
      if((jks==0)&&(jkx==2))
      { jks=strstr(buf1,P_POSTOFFICE);if(jks!=0)jkx=3;}
      if((jks==0)&&(jkx==3))
      { jks=strstr(buf1,nnn);
        if(jks==0) { strcat(bufx,buf1);}
        else
        { rb_mk=(long)ftell(fpi);
          fprintf(fpo1,"%s\n",bufx);
          fprintf(fpo2,"%s\n",bufx);
          for(i=0;i<1024;i++)*(bufx+i)=0;
          jkx=-1;
        }
      }
    }
    for(i=0;i<128;i++)*(buf1+i)=0;
  } while((imk!=EOF));
}
/*
  To read a line telegram .
*/
int fline(FILE *fp,char *buf1)
{ int ch; int icnt;
  char che='\n';
  char *px;
  px=buf1;
  icnt=0;
  do
  { ch=fgetc(fp);
    *px=(char)ch;
    px++; icnt++;
  }while((ch!=che)&&(ch!=EOF)&&(icnt<128));
  *px=0;
  if(ch==EOF) { return EOF;}
  else { return strlen(buf1);}
}
/*
 To delete the more one space .
*/
int proc1(char *buf1)
{ char *i,*jks;
  char * space="  ";
  int len;
  for(i=buf1;*i!=0;i++)if(*i<' ')*i=' ';
  for(i=buf1;*i!=0;i++)if(*i>126)*i=' ';
  do
  { jks=strstr(buf1,space);
    if(jks!=0)for(i=jks;*i!=0;i++)*i=*(i+1);
  }while(jks!=0);
  len=strlen(buf1);
  jks=buf1+len-1;
  if(*(jks)!=' ') {jks=jks+1; *jks=' ';}
  if(*buf1==' ')  {for(i=buf1;*i!=0;i++)*i=*(i+1);}
  len=strlen(buf1);
  return len;
}
/*
 To convert lower to upper .
*/
void proc2(char *buf1)
{ int i,len;
  len=strlen(buf1);
  for(i=0; i<=len; i++)buf1[i]=(char)toupper(buf1[i]);
}
/*
  To analysis profix and flow NO. .
*/
int proc3(char *ls)
{ int len,k,i;
  len=strlen(ls);
  if(len==6) { k=2;} else { k=3;}
  for (i=0;i<k    ;i++)if((isalpha((int)ls[i]))==0)return -1;
  for (i=k;i<len-1;i++)if((isdigit((int)ls[i]))==0)return -1;
  return 0;
}
int  semset(void)
{ int semset_semid;
  key_t semset_key=   P_SEMSKEY;
  int semset_nsems=   P_SEMNUMB;
  int semset_semflg=  IPC_CREAT|P_SEMACCESS;
  semset_semid=semget(semset_key,semset_nsems,semset_semflg);
  return semset_semid;
}
int  semopena(int semset_semid,int semset_semno)
{ extern int errno; int status; 
  int semset_semflg=P_SEMACCESS;
  struct sembuf *semset_sops;
  struct sembuf semset_sopsbuf;
  size_t semset_nsops=1;
  semset_sops=&semset_sopsbuf;
  semset_sopsbuf.sem_num=semset_semno;
  semset_sopsbuf.sem_op=-1;
  semset_sopsbuf.sem_flg=semset_semflg;
  status=semop(semset_semid,semset_sops,semset_nsops); 
  if(status==-1) {return -1;} else {return 0;}
}
int  semopenr(int semset_semid,int semset_semno)
{ extern int errno; int status;
  int semset_semflg=P_SEMACCESS|IPC_NOWAIT;
  struct sembuf *semset_sops;
  struct sembuf semset_sopsbuf;
  size_t semset_nsops=1;
  semset_sops=&semset_sopsbuf;
  semset_sopsbuf.sem_num=semset_semno;
  semset_sopsbuf.sem_op=-1;
  semset_sopsbuf.sem_flg=semset_semflg;
  status=semop(semset_semid,semset_sops,semset_nsops); 
  if(status==-1) {return -1;} else {return 0;}
}
int semclose(int semset_semid, int semset_semno)
{ extern int errno; int status;
  int semset_semflg=P_SEMACCESS|IPC_NOWAIT;
  struct sembuf *semset_sops;
  struct sembuf semset_sopsbuf;
  size_t semset_nsops=1;
  semset_sops=&semset_sopsbuf;
  semset_sopsbuf.sem_num=semset_semno;
  semset_sopsbuf.sem_op=1;
  semset_sopsbuf.sem_flg=semset_semflg;
  status=semop(semset_semid,semset_sops,semset_nsops); 
  if(status==-1) {return -1;} else {return 0;}
}

⌨️ 快捷键说明

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