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

📄 tcpservx.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 <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include "nfcnet.h"
int in_use[P_MAXSOCKET];
int in_add[P_MAXSOCKET];
char fname[50], fnm[50];
char node[P_SENDOBJ+1][4];
char host[P_SENDOBJ+1][15];
short flag=0;
struct timeval seltime;
fd_set readfds,writefds;
char buf[P_SIZEBUF+1];
time_t in_tim[P_MAXSOCKET],now_tim;
int semid;
void build_tabl(void);
void make_new_echo(int);
void read_and_echo(int);
void gen_fname(int);
void clearfile(int);
void transfer_file(int);
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(void)
{ extern int errno;
  struct sockaddr_in addr;
  int s, x;
  semid=semset();
  printf("Semid is %d\n",semid);
  build_tabl();
  for (x=0; x<P_MAXSOCKET; x++) { in_use[x]=0; in_add[x]=-1;}
  if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  { printf("The error is found in open socket .\n");
    printf("Error number = %d\n",errno); exit(1);}
  printf("\nThe listen socket NO. is %d .\n",s);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(P_ECHOPORT);
  addr.sin_addr.s_addr = INADDR_ANY;
  if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
  { printf("The error is found in bind .\n");
    printf("Error number = %d\n",errno); (void) close(s);exit(1); }
  if(listen(s, 20) < 0)
  { printf("The error is found in listen .\n");
    printf("Error number = %d\n",errno);(void) close(s);exit(1);}
  printf("TCPSERV Waitting for receiving from TCPCLNT .\n\n");
  for (;;)
  { for (x = 2; x<P_MAXSOCKET; x++)
    { if(in_use[x]==1)
      { time(&now_tim);
        if(now_tim-in_tim[x] > 30)
        { printf("Closing socket #%d for timeout .\n", x);
          clearfile(x); 
          (void)close(x); 
          in_use[x]=0; 
        }
      }
    }
    FD_ZERO(&readfds);
    seltime.tv_sec = 30;
    seltime.tv_usec = 0;
    FD_SET(s, &readfds);
    for (x = 0; x < P_MAXSOCKET; x++){ if(in_use[x]){FD_SET(x, &readfds); } }
    if(!select(P_MAXSOCKET,&readfds,(fd_set *)0,(fd_set *)0,&seltime))
    { /*printf("Waiting for connect in timeout .\n"); */ continue;}
    for (x = 0; x < P_MAXSOCKET; x++)
    { if(FD_ISSET(x, &readfds))
      { if(x == s)make_new_echo(x); else
        if(in_use[x]==1)
        { read_and_echo(x);
          time(&now_tim);
          in_tim[x] = now_tim;
        }
      }
    }
  }
}
void build_tabl(void)
{ int btemp,bi,bj,xx[4];
  FILE *fp;
  if((fp=fopen("/nfcnet/sysd/obj_addr.tab","rb"))==NULL)
  { printf("TCPSERV 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("TCPSERV OBJ_ADDR is error .\n"); exit(1);}
      xx[bj]=btemp; node[bi][bj]=(char)btemp;
    }
    sprintf(host[bi],"%03d.%03d.%03d.%03d",xx[0],xx[1],xx[2],xx[3]);
    printf("Host addr = %s .\n",host[bi]);  
  }
  fclose(fp);
  return;
}
void gen_fname(int addr_m)
{
  if(flag==0)sprintf(fname,"/nfcnet/netr/r%03d0.dat",addr_m);
  if(flag==1)sprintf(fname,"/nfcnet/netr/r%03dlast.dat",addr_m);
}
void clearfile(int xsock)
{ FILE *fp;
  if(in_add[xsock]==-1)return;
  gen_fname(in_add[xsock]);
  in_add[xsock]=-1;
  fp=fopen(fname,"w+");
  close(fp);
}
void make_new_echo(int s)
{ extern int errno;
  int xsock;
  int ijk;
  struct sockaddr_in peer;
  size_t peersize = sizeof(peer);
  xsock=accept(s, (struct sockaddr *)&peer, &peersize);
  printf("Created socket #%d from %s:%d\n",
         xsock, inet_ntoa(peer.sin_addr), htons(peer.sin_port));
  if(xsock<0)
  { printf("Could not accept new connection .\n");
    printf("Error number = %d\n",errno); exit(1); }
  in_use[xsock] = 1;
  time(&now_tim);
  in_tim[xsock] = now_tim;
  for (ijk=0; ijk<P_MAXSOCKET; ijk++){printf("%d",in_use[ijk]);}  
  printf("\n\n");
  /*
  for (ijk=4; ijk<P_MAXSOCKET; ijk++)
  {
    if((ijk!=s)&&(in_use[ijk]=01)){(void)close(ijk);}
  }
  */
  
}
void read_and_echo(int xsock)
{ extern int errno;
  int statusx, xlen, addr_m, rd_len, i;
  char ack=6, nak=21;
  FILE *fp;
  if((xlen = read(xsock,&buf, P_SIZEBUF)) <= 0)
  {
    printf("The error is found in reading(socket %d) !\n", xsock);
    printf("Error number = %d\n",errno);
    clearfile(xsock);
    (void) close(xsock);
    in_use[xsock]=0;
    return;
  }
/*
 * To looking for the address in table .
 */
  addr_m=-1;
  for (i=1;i<=P_SENDOBJ;i++)
  { if((buf[0]==node[i][0])&&(buf[1]==node[i][1])&&
        (buf[2]==node[i][2])&&(buf[3]==node[i][3]))
    { addr_m=i; in_add[xsock]=addr_m;break; }
  }
  if(addr_m==-1)
  {
    printf("There isn't the address in table .\n");
    printf("Closing socket #%d\n", xsock);
    clearfile(xsock);
    (void)close(xsock);
    in_use[xsock]=0;
    return;
  }
/*
 * To looking for the end of packet .
 */
  if((buf[xlen-1]!='@')&&(buf[xlen-1]!='*')&&(buf[xlen-1]!='#'))
  {
    printf("The error is found in packet end .\n");
    statusx = write(xsock, &nak, 1);
    if(statusx < 0)
    {
      printf("The error is found in writing(Echo NAK) .\n");
      printf("Errorr NO. is %d\n",errno);
      clearfile(xsock);
      (void) close(xsock);
      in_use[xsock]=0;
      return;
    }
    else  {return;}
  }
/*
 * To differ the type of packet .
 */
  if(buf[xlen-1]=='@'){flag=1; } else{flag=0; }
  gen_fname(addr_m);
  if(flag==1)
  {fp=fopen(fname,"w+"); }
  else
  {fp=fopen(fname,"a+"); }
  if(buf[xlen-1]=='@')
  { for(i=xlen-2;i>=4;i--)
    if(buf[i]!=' '){ rd_len=i; break; } }
    else{rd_len=i-1;} 
  if(buf[xlen-1]=='*') rd_len=xlen-2;
  if(buf[xlen-1]=='#')
  { for(i=xlen-2;i>=4;i--)
    if(buf[i]!=' '){ rd_len=i; break; }
    else{rd_len=i-1;} 
  }
  for (i=4;i<=rd_len;i++){ fputc(buf[i],fp); }
  fclose(fp);
  statusx = write(xsock, &ack, 1);
  if(statusx <= 0)
  { printf("The error is found in writing(Echo ACK) !\n");
    printf("Error NO. is %d\n",errno);
    clearfile(xsock);
    (void) close(xsock); 
    in_use[xsock]=0; 
    return; 
  }
  if(buf[xlen-1]=='#')
  { printf("Complate receive from TCPCLNT(#%d) for text .\n",xsock);
    transfer_file(in_add[xsock]);
    in_add[xsock]=-1; 
    (void)close(xsock);
    in_use[xsock] = 0;
    return;
  }
  if(buf[xlen-1]=='@')
  { printf("Complate receive from TCPCLNT(#%d) for last .\n",xsock); 
    in_add[xsock]=-1; 
    (void)close(xsock); 
    in_use[xsock] = 0;
    return;
  }
  return;
}
void transfer_file(int obj_no)
{ FILE  *fp1,*fp2,*fpx;
  int getch1, statusx;
  char fn1[50],fn2[50];
  char strbuf[4096];
  sprintf(fn1,"/nfcnet/netr/r%03d0.dat",obj_no);
  sprintf(fn2,"/nfcnet/netr/r%03d1.dat",obj_no);
  statusx=semopena(semid,P_R0);
  fp1=fopen(fn1,"rb+"); fp2=fopen(fn2,"ab+");
  while(1)
  { if((fgets(strbuf,4096,fp1))==NULL)break;
    fprintf(fp2,"%s",strbuf);
  }
  /*
  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_R0);
  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 + -