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

📄 srt_tele.c

📁 unix下进行电报传输的源码。采用信号灯技术避免文件冲突等等
💻 C
字号:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.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_map(void);
void sort_tel(FILE *fp, FILE *fpt);
void out_tele(int i);
void mod_last(int i);
void get_pfnew(int i);
void get_stt(void);
int ana_obj(int i, int j);
int ana_stt(void);
int fline(FILE *fp);
char tele[3072]={0},pfnew[8]={0},stt[6]={0};
int pfnewno;
char *p0,*p1,*p2,*p3;
char *tzm[22]={"(R)",  "01110","02220","03330",
	       "04440","11111","12221","13331",
	       "14441","15551","16661","17771",
	       "21112","22222","23332","24442",
	       "25552","26662","31113","32223",
	       "87778","88888"};
char map[P_STTNUMB][P_STTOBJM]={0};
char allmap[P_SENDOBJ+2]={0};
int statusx,semid;
void main()
{ char fni[50];
  FILE *fp,*fpt;
  int in,i,j,ijk;
  semid=semset();
  printf("Semid is %d\n",semid);
  for(i=0;i<3072;i++)tele[i]=0;
  p0=&tele[0];
  /* To get station object bits map .*/
  get_map();
  ijk=0;
  for(;;)
  {
    statusx=semopenr(semid,P_PR_SORT);
    if(statusx==0)
    { if((fp=fopen("/nfcnet/temp/pr_sort0.tmp","rb+"))==NULL)
      { fp=fopen("/nfcnet/temp/pr_sort0.tmp","a+");
        fclose(fp);
        fp=fopen("/nfcnet/temp/pr_sort0.tmp","rb+");}
      fpt=fopen("/nfcnet/temp/pr_sort1.tmp","ab+");
      for(;;){in=fgetc(fp); if(in==EOF)break; fputc(in,fpt);}
      fp=freopen("/nfcnet/temp/pr_sort0.tmp","w+",fp);
      fclose(fp);
      fclose(fpt);
/*    sleep(1); */ /* for testing */
      statusx=semclose(semid,P_PR_SORT);
    }
    if(statusx==-1) printf("SRT_TELE(P_PR) semopenr is error !\n");
    statusx=semopenr(semid,P_NP_SORT);
    if(statusx==0)
    { if((fp=fopen("/nfcnet/temp/np_sort0.tmp","rb+"))==NULL)
      { fp=fopen("/nfcnet/temp/np_sort0.tmp","a+");
        fclose(fp);
        fp=fopen("/nfcnet/temp/np_sort0.tmp","rb+");}
      fpt=fopen("/nfcnet/temp/np_sort1.tmp","ab+");
      for(;;){in=fgetc(fp); if(in==EOF)break; fputc(in,fpt);}
      fp=freopen("/nfcnet/temp/np_sort0.tmp","w+",fp);
      fclose(fp);
      fclose(fpt);
/*    sleep(1); */ /* for testing */
      statusx=semclose(semid,P_NP_SORT);
    }
    if(statusx==-1) printf("SRT_TELE(P_NP) semopenr is error !\n");
    statusx=semopena(semid,P_S0);
    statusx=semopena(semid,P_SR_TRAN);
    fpt=fopen("/nfcnet/temp/sr_tran0.tmp","a+");
    fp=fopen("/nfcnet/temp/pr_sort1.tmp","r+");
    sort_tel(fp,fpt);
    fp=freopen("/nfcnet/temp/pr_sort1.tmp","w+",fp);
    fclose(fp);
    fp=fopen("/nfcnet/temp/np_sort1.tmp","r+");
    sort_tel(fp,fpt);
    fp=freopen("/nfcnet/temp/np_sort1.tmp","w+",fp); 
    fclose(fp);
    statusx=semopenr(semid,P_MA_SORT);
    if(statusx==0)
    { if((fp=fopen("/nfcnet/temp/ma_sort1.tmp","r+"))==NULL)
      fp=fopen("/nfcnet/temp/ma_sort1.tmp","a+");
      sort_tel(fp,fpt);
      fp=freopen("/nfcnet/temp/ma_sort1.tmp","w+",fp);
      fclose(fp);
      statusx=semclose(semid,P_MA_SORT);}
    if(statusx==-1) printf("SRT_TELE(P_MA) semopenr is error !\n");
    fclose(fpt);
/*  sleep(1); */ /* for testing */
    statusx=semclose(semid,P_SR_TRAN);
    statusx=semclose(semid,P_S0);
    printf("SRT_TELE Waiting for (%d) mins(%d) .\n",P_SLEEPTIME,ijk);
    ijk++;
    if(ijk==1000)ijk=0;
    sleep(P_SLEEPTIME*60);
  }
}
/*
 To get object map from file OBJECT.MAP .
*/
void get_map(void)
{ FILE *fp; int in; int i,j;
  if((fp=fopen("/nfcnet/sysd/stat_obj.map","rb"))!=NULL)
  { for(i=0; i<P_STTNUMB; i++)
    for(j=0; j<P_STTOBJM;j++)
    { if((in=fgetc(fp))!=EOF) map[i][j]=(char)in;
      else { printf("SRT_TELE file, stat_obj.map, is error !\n"); exit(1);}
    }
  }
  else { printf("SRT_TELE file, stat_obj.map, is not found !\n"); exit(1); }

  if((fp=fopen("/nfcnet/sysd/sendall.map","rb"))!=NULL)
  { for(i=1; i<=P_SENDOBJ; i++)
    { if((in=fgetc(fp))!=EOF)
      { allmap[i]=(char)in;
        if(in != 'Y' && in != 'N')
        { printf("SRT_TELE file, sendall.map, is error !\n"); exit(1); }
      }
      else 
      { printf("SRT_TELE file, sendall.map, is error !\n"); exit(1);}
    }
  }
  else
  { printf("SRT_TELE file, sendall.map, is not found !\n"); exit(1); }
}
/*
 To sort the telegram onto sending file .
*/
void sort_tel(FILE *fp, FILE *fpt)
{ int i,j,k,imk;
/*To get a telegram from fni .*/
  for (;;)
  { imk=fline(fp);
    if(imk==EOF)break;
    fprintf(fpt,"%s\n",p0);
/* for stat_obj.map */
    get_stt();
    j=ana_stt();
    if(j!=-1)
    { for(i=1;i<=P_SENDOBJ;i++)
      { k=ana_obj(i,j);               /* k=1/yes k=0/no */
        if(k==1)
        { get_pfnew(i);
          out_tele(i);
          mod_last(i);
        }
      }
    }
/* for sendall.map */
    for(i=1;i<=P_SENDOBJ;i++)
    { if(allmap[i]=='Y')
      { get_pfnew(i);
        out_tele(i);
        mod_last(i);
      }
    }
  }
}
int fline(FILE *fp)
{ int ch, i;
  i=0;
  for(;;)
  { if((ch=fgetc(fp))==EOF){return EOF;}
    if(ch>=' '){tele[i]=(char)ch;i++;}
    if(ch=='\n'){tele[i]=0; return i;}
  }
}
void get_stt(void)
{ int i;
  p1=strstr(p0," ");p1++;
  p2=strstr(p1," ");p2++;
  for(i=0;i<22;i++){p3=strstr(p1,tzm[i]);if(p1==p3){p1=p2;break;}}
  p2=strstr(p1," ");
  if((p2-p1)!=5){for(i=0;i<6;i++)stt[i]=0;}
  else { for(i=0;i<6;i++)stt[i]=*(p1+i);}
}
int ana_stt(void)
{ int i,j,k;
  k=-1;
  for(i=0;i<P_STTNUMB;i++)
  { for(j=0;j<5;j++){if(stt[j]!=map[i][j])k=-2;}
    if(k==-1)k=i; if(k==-2)k=-1;
    if(k!=-1){break;}
  }
  return k;
}
int ana_obj(int i, int j)
{ int i1,i2,k,k1,k2;
  i1=i/8; i2=i%8;
  if(i2==0){i1=i1-1;i2=8;}
  k2=1; for(k1=1;k1<=i2;k1++)k2=k2*2; k2=k2/2;
  k1=map[j][i1+5];
  k=k1&k2; if(k!=0)k=1;
  return k;
}
void get_pfnew(int i)
{ char fnord[50];
  int ilst;
  FILE *fp1;
  sprintf(fnord,"/nfcnet/sysd/last%03d.dat",i);
  if((fp1=fopen(fnord,"r"))!=NULL)
  { fscanf(fp1,"%d",&ilst); fclose(fp1);}
  else { ilst=0;}
  ilst++; if(ilst==10000)ilst=1;
  sprintf(pfnew,"%s%04d %c",P_NEWFIX1,ilst,0);
  pfnewno=ilst;
}
void out_tele(int i)
{ char fnsnd[50];
  FILE *fp1;
  sprintf(fnsnd,"/nfcnet/nets/s%03d0.dat",i);
  for(;;){ if((fp1=fopen(fnsnd,"a+"))!=NULL)break;}
  fprintf(fp1,"%s%s\n",pfnew,p0);
  fclose(fp1);
}
void mod_last(int i)
{ char fnlst[50],fnord[50];
  FILE *fp1;
  sprintf(fnord,"/nfcnet/sysd/last%03d.dat",i);
  sprintf(fnlst,"/nfcnet/nets/s%03dlast.dat",i);
  for(;;){if((fp1=fopen(fnlst,"w+"))!=NULL)break;}
  fprintf(fp1,"%s",pfnew);
  fclose(fp1);
  for(;;){if((fp1=fopen(fnord,"w+"))!=NULL)break;}
  fprintf(fp1,"%d",pfnewno);
  fclose(fp1);
}
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 + -