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

📄 rec_tele.c

📁 unix下进行电报传输的源码。采用信号灯技术避免文件冲突等等
💻 C
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <fcntl.h>
#include <termio.h>
#include <unistd.h>
#include <string.h>
#include "nfcnet.h"
void delaymsec(int);  /* 1/100 second */
int open_device(int *);
int portinit(int);
int devid; int semid;
void gtfname(char *);
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);
main()
{ extern int errno;
  char chask=5, chreq=2, chdel=3, chack, buf[32768]={0};
  int ord,count,ijk,i,statusx,readcnt;
  FILE *f;
  FILE *fp; int chsnd;
  open_device(&devid);
  printf("\nREC_TELE is ready to receving .\n\n");
  semid=semset(); ijk=0;
  printf("Semid is %d\n",semid);
  while (1)
  { while(1)
    { while(write(devid,&chask,1)<1){ sleep(10);}
      printf("Write ask(5) is successfull !\n");
      chack=readcnt=0;
      while(read(devid,&chack,1) <1)
      { printf("Read ack is error !\n");
        if((readcnt++)==1000)break; delaymsec(1);}
      if(readcnt==1000){ sleep(P_SLEEPTIME*60); continue;}
      printf("Read ack(6/8) is successfull !\n");
      if((chask==6)||(chask==8))
      {
        statusx=semopena(semid,P_SENDTEL);
        if((fp=fopen("/nfcnet/temp/sendtele.tmp","rb"))!=NULL)
        { for(;;)
          { if((chsnd=fgetc(fp))==EOF)break;
            while(write(devid,&chsnd,1)<1){ sleep(10);}
          }
          fclose(fp);
          fp=fopen("/nfcnet/temp/sendtele.tmp","w+");
          fclose(fp);
        }
        statusx=semclose(semid,P_SENDTEL);
      }
      if((chack==8)||(chack==88))
      { printf("You can get telegram from the box !\n"); break; }
      if((chack==6)||(chack==86))
      { printf("No more in the box and waiting %d MINs !\n", P_SLEEPTIME);
        for(i=0;i<60;i++)
        { while(write(devid,&chask,1)<1){ sleep(10);}
          chack=readcnt=0;
          while(read(devid,&chack,1) <1)
          { if((readcnt++)==1000)break; delaymsec(1);}
          if((chask==6)||(chask==8))
          {
            statusx=semopena(semid,P_SENDTEL);
            if((fp=fopen("/nfcnet/temp/sendtele.tmp","rb"))!=NULL)
            { for(;;)
              { if((chsnd=fgetc(fp))==EOF)break;
                while(write(devid,&chsnd,1)<1){ sleep(10);}
              }
              fclose(fp);
              fp=fopen("/nfcnet/temp/sendtele.tmp","w+");
              fclose(fp);
            }
            statusx=semclose(semid,P_SENDTEL);
          }
          sleep(P_SLEEPTIME);
        }
        continue;
      }
      printf("The ack is unknown(%d) !\n",chack);
    }
    count=strlen(buf);
    for (ord=0;ord<=count;ord++) buf[ord]=0; ord=0;
    statusx=semopena(semid,P_SENDTEL);
    while(write(devid,&chreq,1)<1){ sleep(10);}
    printf("write reg(2) is successfull !\n");
    readcnt=0;
    for(;;)
    { while((count=read(devid,&buf[ord],100))>0){ord+=count; readcnt=0;}
      delaymsec(1); if((readcnt++)==1000) break;
      if(strstr(buf,"NNNN")==NULL)continue;else break;
    }
    if(readcnt==1000)continue;
    savedata(buf);
    printf("REC_TELE has received a tele(%d) .\n",ijk);
    ijk++;if(ijk==1000)ijk=0;
    while(write(devid,&chdel,1)<1){ sleep(10);}
    printf("write del(3) is successfull !\n");
    statusx=semclose(semid,P_SENDTEL);
    delaymsec(1);
  }
}
void delaymsec(int n)
{ struct timeval tp,tp0;
  long dif,dif0;	
  gettimeofday(&tp0,NULL);
  dif0=tp0.tv_usec/10000;
  do{ gettimeofday(&tp,NULL);
      dif=tp.tv_usec/10000;
    }while((dif-dif0+100)%100<n);
}
int open_device(int *devid)
{ int retry, devidd, count;
  retry=1; count=0;
  while(retry)
  { if((devidd=open(P_DEVNAME,O_RDWR|O_NONBLOCK))==-1)
    { printf("REC_TELE open (%s) failed .\n",P_DEVNAME);
      count++; if(count==5)exit(2); continue;}
    if (portinit(devidd)<0)
    { printf("REC_TELE Port (%s) initial failed .\n",P_DEVNAME);
      close(devidd); exit(2); }
    *devid=devidd;
    retry=0;
  }
}
int portinit(int devid)
{ struct termio	tm;

  if(ioctl(devid,TCGETA,&tm)<0)
  { printf("REC_TELE Can't get %s speed .\n",P_DEVNAME);
    return(-1);}
  tm.c_cflag&=~(CBAUD|CSTOPB|PARENB|PARODD);
  tm.c_cflag|=(P_PORTBAUD|P_DATABIT|CLOCAL);
  tm.c_iflag|=(IXON|BRKINT|IXOFF|IGNBRK);
  tm.c_iflag&=~(ISTRIP|IGNCR);
  tm.c_oflag|=(ONLCR|OFDEL|NL0|CR0|TAB3|BS0|VT0|FF1);
  tm.c_oflag&=~(OLCUC|OCRNL|ONOCR|ONLRET|OFILL|OPOST);
  tm.c_lflag=ISIG|NOFLSH|ECHOCTL;
/*
  tm.c_lflag|=(FLUSHO|TOSTOP);
  tm.c_cflag&=~(ECHO);
  tm.c_cflag&=~(ECHO|ICANON|NOFLSH|PENDIN);
*/
  tm.c_cc[VMIN]=1;
  tm.c_cc[VTIME]=0;
  if (ioctl(devid,TCSETA,&tm)<0)
  { printf("REC_TELE Can't set %s baud .\n",P_DEVNAME);
    return(-1);}
  return(0);
}
void gtfname(char *buf)
{ time_t t;
  struct tm tr,*pt;
  time(&t);
  tr=*localtime(&t);
  sprintf(buf,"/nfcnet/tele/te%02d%02d%02d.tel",
  tr.tm_year,tr.tm_mon+1,tr.tm_mday);
}
savedata(char *buf)
{ FILE *f;
  char fname[50];
  int l=strlen(buf);
  gtfname(fname);
  f=fopen(fname,"ab");
  fwrite(buf,l,1,f);
  fclose(f);
}
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 + -