📄 tcpservx.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 + -