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