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

📄 tcpclntx.c

📁 unix下进行电报传输的源码。采用信号灯技术避免文件冲突等等
💻 C
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include"nfcnet.h"
char node[P_SENDOBJ+1][4]={0};
char host[P_SENDOBJ+1][16]={0};
char *hostaddr="***.***.***.***";
char fname[50]; FILE *xfp;
short flag;
char buf[P_SIZEBUF+1];
int iyy,imm,idd,ihh,imn,iss;
int semid;
int Start_NO,End_NO;
struct timeval  seltime;
fd_set readfds, writefds;
void yymmdd(void);
void build_tabl(void);
void safe_trans(short);
void gen_fname(int i);
long file_size(void);
void clearfile(void);
void transport(void);
void transfer_file(void);
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(int argc, char *arg[])
{ extern int errno; int i,j,ijk;
  time_t  now_tim,lst_tim,tel_tim,int_tim;
  semid=semset();
  printf("Semid is %d\n",semid);
  if(argc<3){printf("The arg is error ");exit(0);}
  Start_NO=atoi(arg[1]);
  End_NO=atoi(arg[2]);
  for(i=0;i<=P_SENDOBJ;i++)
  for(j=0;j<=15;j++)host[i][j]=0;
/*if(!loaded()){ printf("The TCP/IP is not loaded .\n"); exit(1); } */
  build_tabl();
/*To send telegram & last NO. . */
  transfer_file();
  safe_trans(0);
  if(P_LASTTIME!=0)
  {
    sleep(5);
    safe_trans(1);
  }
  sleep(5);
  safe_trans(0);
/*To get the current time seconds since 00:00:00 1-JAN-1970 . */
  time(&now_tim);
  tel_tim=now_tim;
  lst_tim=now_tim; 
/*According the interval time to send telegram or last NO. . */
  ijk=0;
  for (;;)
  { time(&now_tim);
    int_tim=now_tim-tel_tim;
    if(int_tim >= P_INTETIME*60)
    {
      transfer_file();
      safe_trans(0);
      sleep(5);
      time(&now_tim);
      tel_tim=now_tim;
      safe_trans(0);
    }
    if(P_LASTTIME!=0)
    {
      sleep(5);
      int_tim=now_tim-lst_tim;
      if(int_tim >= P_LASTTIME*60)
      {
        safe_trans(1);
        time(&now_tim);
        lst_tim=now_tim;
      }
    }
    printf("TCPCLNT Waiting for (%d) mins(%d) .\n",P_SLEEPTIME,ijk);
    ijk++;if(ijk==1000)ijk=0;
    sleep(P_SLEEPTIME*60);
  } /* end for */
}
void gen_fname(int i)
{
  if(flag==0) { sprintf(fname,"/nfcnet/nets/s%03d1.dat%c",i,0); }
  if(flag==1) { sprintf(fname,"/nfcnet/nets/s%03dlast.dat%c",i,0); }
}
void build_tabl(void)
{ int btemp,bi,bj,xx[4];
  FILE *fp;
  if((fp=fopen("/nfcnet/sysd/obj_addr.tab","rb"))==NULL)
  { printf("TCPCLNT OBJ_ADDR is not exist .\n"); exit(1);}
  for (bi=0;bi<=P_SENDOBJ;bi++)
  { for (bj=0;bj<=3;bj++)
    { btemp=fgetc(fp);
      if(btemp==-1){printf("TCPCLNT OBJ_ADDR is error .\n"); exit(1);}
      xx[bj]=btemp;node[bi][bj]=(char)btemp;
    }
    sprintf(host[bi],"%d.%d.%d.%d",xx[0],xx[1],xx[2],xx[3]);
    printf("Host addr = %s .\n",host[bi]);  
  }
  fclose(fp);
  return;
}
long file_size(void)
{ int handle; long f_size; FILE *fp;
  f_size=0;
  if((fp=fopen(fname,"r"))==NULL)fp=fopen(fname,"a+");
  fseek(fp,0L,SEEK_END);
  f_size=ftell(fp);
  fclose(fp);
  return f_size;
}
void clearfile(void)
{ FILE *fp;
  fp=freopen(fname,"w+",xfp);
  xfp=fp;
  return;
}
void safe_trans(short flg)
{ int i; FILE *fp;
  if(flg==0){flag=0;}else {flag=1;}
  for(i=Start_NO;i<=End_NO;i++)
  { hostaddr=host[i];
    gen_fname(i);
    if((fp=fopen(fname,"r"))!=NULL)
    { fclose(fp);
      if(file_size()==0l){ continue; }
      printf("TCPCLNT Ready to send to %s .\n",hostaddr);           
      transport();
    }
  }
  return;
}
/*
 * Send routine .
 */
void transport(void)
{ extern int errno;
  int                sock, rc, len,c;
  char               ack;
  int getch, sd_mk,sdcnt;
  struct sockaddr_in addr;
  u_long hp;
/*To check the remote ip address . */
  if((xfp=fopen(fname,"rb+"))==NULL)
  { printf("The file, %s Can't be opened .\n",fname); return; }
/*To create the socket . */
  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock < 0) 
  { printf("The error is found in creating socket .\n");
    printf("Error number = %d\n",errno); fclose(xfp); return; }
/*
  bzero(&addr,sizeof(addr));
*/
  addr.sin_family = AF_INET;
/*
  hp=gethostbyaddr(hostaddr,15,AF_INET);
  if(hp = 0)
  { printf("The error is found in address .\n");
    printf("Error number = %d\n",errno); fclose(xfp); return; }
  memcpy((char*)&addr.sin_addr,(char*)hp->h_addr,hp->h_length);
*/
  hp=inet_addr(hostaddr);
  if(hp==-1)
  { printf("The error is found in address .\n");
    printf("Error number = %d\n",errno); fclose(xfp); return; }
  addr.sin_addr.s_addr=hp;
  addr.sin_port = htons(P_ECHOPORT);
  if(connect(sock,(struct sockaddr *)&addr, sizeof(addr)) < 0) 
  { printf("The error is found in connect remote host .\n");
    printf("Error number = %d\n",errno); fclose(xfp);
    (void)close(sock); return; }
  printf("The connection is successfull .\n");
  yymmdd();
  if(flag==1)sprintf(buf,"    %02d %02d %02d %02d:%02d",iyy,imm,idd,ihh,imn);
  buf[0]=node[0][0];  buf[1]=node[0][1];
  buf[2]=node[0][2];  buf[3]=node[0][3];

  while (!feof(xfp))
  { if(flag==1) {c=18;} else {c=4;}
    while ((!feof(xfp))&&(c<=P_SIZEPACK-2))
    { getch=fgetc(xfp);if(getch==-1)continue; buf[c]=(char)getch; c++; }
    buf[P_SIZEPACK-1]='*';
    if(c<=P_SIZEPACK-2)for (len=c;len<=P_SIZEPACK-2;len++)buf[len]=' ';
    if((flag==0)&&feof(xfp))buf[P_SIZEPACK-1]='#';
    if(flag==1)buf[P_SIZEPACK-1]='@';
    sd_mk=0;
    sdcnt=0;
    for(;;)
    { FD_ZERO(&readfds); FD_SET(sock,&readfds); 
      FD_ZERO(&writefds);FD_SET(sock,&writefds);
      seltime.tv_sec = 30; seltime.tv_usec = 0;
      rc = select(sock+1,&readfds,&writefds,(fd_set *)0,&seltime);
      if(rc < 0)
      { printf("The error is found in select for write .\n");
        printf("Error number = %d\n",errno); fclose(xfp);
        (void)close(sock); return;}
      if(rc = 0)continue;
      ack=0;
      if(FD_ISSET(sock,&readfds))
      { rc=read(sock,&ack,1);
        if(rc<=0)
        { printf("The error is found in read socket .\n");
          printf("Error number = %d\n",errno); fclose(xfp);
          (void)close(sock); return; }
        if(ack==6)
        { if (buf[P_SIZEPACK-1]=='#')
          { printf("The send is successfull for text .\n");
            (void)close(sock); clearfile(); fclose(xfp); return;}
          if (buf[P_SIZEPACK-1]=='@')
          { printf("The send is successfull for last .\n");
            fclose(xfp); (void)close(sock); return; }
          if (buf[P_SIZEPACK-1]=='*')break;
        }
        if(ack==21){ sd_mk=0; continue;}
        if((ack!=6)&&(ack!=21))
        { printf("The error is found in ACK received .\n");
          printf("The ACK is %d\n",ack);
          fclose(xfp); (void)close(sock); return; }
      } /* end FD_ISSET is ture for read */
      if(sd_mk == 0)
      { sdcnt++;
        if(sdcnt>=5)
        { printf("The sending is not successful for 5 times .\n");
          fclose(xfp); (void)close(sock); return; }
        if(FD_ISSET(sock, &writefds)) 
        { rc = write(sock, buf, P_SIZEPACK);
          if (rc <= 0)
          { printf("The error is found in write .\n");
            printf("Error number = %d\n",errno);
            (void) close(sock); fclose(xfp); return; }
          sd_mk=1;
        } /* end FD_ISSET is ture for write */
      }
    } /* end for send */ 
  }
  return;
}
void yymmdd(void)
{ time_t idymd;
  struct tm cdymd;
  struct tm *cdymdp;
  cdymdp=&cdymd;
  time(&idymd);
  cdymdp=localtime(&idymd);
  cdymd=*cdymdp;
  iyy=cdymd.tm_year;
  imm=cdymd.tm_mon+1;
  idd=cdymd.tm_mday;
  ihh=cdymd.tm_hour;
  imn=cdymd.tm_min;
  iss=cdymd.tm_sec;
}
void transfer_file(void)
{ FILE *fp1,*fp2,*fpx;
  int getch1,statusx,i;
  char fn1[50],fn2[50];
  statusx=semopenr(semid,P_S0);
  if(statusx==0)
  { for (i=1;i<=P_SENDOBJ;i++)
    { sprintf(fn1,"/nfcnet/nets/s%03d0.dat%c",i,0);
      sprintf(fn2,"/nfcnet/nets/s%03d1.dat%c",i,0);
      if((fp1=fopen(fn1,"rb+"))==NULL)fp1=fopen(fn1,"ab+");
      fp2=fopen(fn2,"ab+");
      while(1){ getch1=fgetc(fp1); if(getch1==-1)break; fputc(getch1,fp2);}
      fpx=freopen(fn1,"w+",fp1);
      fclose(fpx); fclose(fp2);
    }
/*  sleep(1); */ /* for testing */
    statusx=semclose(semid,P_S0);
  }
  if(statusx==-1)printf("TCPCLNT open(S0) is error !\n");
  return;
}
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 + -