/*---------------------------------------------------------------- * send-tcp : send messages to a remote host, TCP-based *---------------------------------------------------------------- */ #include #include #include #include #include #include #include #define MSGSIZE 500 #ifndef IPPORT_MAX #define IPPORT_MAX 65535 /* max port number */ #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif main(argc,argv) int argc; char *argv[]; { extern int errno; extern char *sys_errlist[]; int s, ok, retry; struct sockaddr_in *to; struct hostent *toinfo; char *msg, htoname[MAXHOSTNAMELEN]; u_long toaddr; u_short portnum; switch(argc) { case 1: fprintf(stdout,"Send messages to host: "); fscanf(stdin,"%s",htoname); fprintf(stdout,"on port number: "); fscanf(stdin,"%hu",&portnum); break; case 2: strcpy(htoname,argv[1]); fprintf(stdout,"Send messages to host %s on port number: ",argv[1]); fscanf(stdin,"%hu",&portnum); break; case 3: strcpy(htoname,argv[1]); portnum = (u_short)atoi(argv[2]); fprintf(stdout,"Send messages to host %s on port %d\n", argv[1],portnum); break; default: fprintf(stderr,"%s: wrong number of arguments \n",argv[0]); fprintf(stderr,"Usage: %s [ []]\n",argv[0]); exit(1); } if((portnum < IPPORT_RESERVED) || (portnum > IPPORT_MAX)){ fprintf(stderr,"%s: bad port number\n",argv[0]); exit(1); }; msg = (char *)malloc(MSGSIZE); to = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)); if((toinfo = gethostbyname(htoname)) == NULL) { fprintf(stderr,"Error %d in gethostbyname: %s\n", errno,sys_errlist[errno]); exit(errno); }; toaddr = *(u_long *)toinfo->h_addr_list[0]; to->sin_family = AF_INET; to->sin_addr.s_addr = toaddr; to->sin_port = htons(portnum); if((s = socket (PF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]); exit(errno); }; retry = 1; while(retry) { if(connect(s,(struct sockaddr *)to,sizeof(struct sockaddr_in))== -1) { if(errno == ECONNREFUSED) { close(s); if((s = socket (PF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr,"Error %d in socket: %s\n", errno,sys_errlist[errno]); exit(errno); }; sleep(2); fprintf(stderr,"Retrying to connect\n"); } else { fprintf(stderr,"Error %d in connect: %s\n", errno,sys_errlist[errno]); exit(errno); } } else retry = 0; }; ok = 1; while(ok) { fprintf(stdout,"Message: "); scanf("%s",msg); fprintf(stdout,"\n"); ok = (msg[0] != '0'); if(send (s,msg,strlen(msg),0) == -1) { fprintf(stderr,"Error %d in send: %s\n",errno,sys_errlist[errno]); exit(errno); } } close(s); } /*---------------------------------------------------------------- * rcv-tcp : receive packets, TCP-based *---------------------------------------------------------------- */ #include #include #include #include #include #include #include #define MSGSIZE 500 #ifndef IPPORT_MAX #define IPPORT_MAX 65535 /* max port number */ #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif main(argc,argv) int argc; char *argv[]; { extern int errno; extern char *sys_errlist[]; int s, s1, cc, ok, fromlen, pid; struct sockaddr_in *local_addr, *peer_addr; char *msg, *realmsg; u_long fromaddr; u_short portnum; switch(argc) { case 1: fprintf(stdout,"Receive TCP packets on port number: "); fscanf(stdin,"%hu",&portnum); break; case 2: portnum = (u_short)atoi(argv[1]); fprintf(stdout,"Receive TCP packets on port number: %d\n",portnum); break; default: fprintf(stderr,"%s: wrong number of arguments \n",argv[0]); fprintf(stderr,"Usage: %s []\n",argv[0]); exit(1); } if((portnum < IPPORT_RESERVED)|| (portnum > IPPORT_MAX)) { fprintf(stderr,"%s: bad port number\n",argv[0]); exit(1); }; msg = (char *)malloc(MSGSIZE); realmsg = (char *)malloc(MSGSIZE); peer_addr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)); local_addr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)); local_addr->sin_family = AF_INET; local_addr->sin_addr.s_addr = htonl(INADDR_ANY); local_addr->sin_port = htons(portnum); if((s = socket (PF_INET, SOCK_STREAM, 0)) == -1){ fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]); exit(errno); }; if(bind(s, (struct sockaddr *)local_addr, sizeof(struct sockaddr_in)) == -1){ fprintf(stderr,"Error %d in bind: %s\n",errno,sys_errlist[errno]); exit(errno); }; if(listen(s,5) == -1){ fprintf(stderr,"Error %d in listen: %s\n",errno,sys_errlist[errno]); exit(errno); }; fprintf(stdout,"Ready to accept connections\n"); while(1){ fromlen = sizeof(struct sockaddr_in); if((s1 = accept(s,(struct sockaddr *)peer_addr,&fromlen)) == -1){ fprintf(stderr,"Error %d in accept: %s\n",errno,sys_errlist[errno]); exit(errno); }; pid = fork(); /* create a son to handle the connection */ switch(pid){ case -1: fprintf(stderr,"Error %d in fork: %s\n",errno,sys_errlist[errno]); exit(errno); case 0: ok = 1; while(ok){ if((cc = recv (s1,msg,MSGSIZE,0)) == -1){ fprintf(stderr,"Error %d in recv: %s\n", errno,sys_errlist[errno]); exit(errno); }; fromaddr = peer_addr->sin_addr.s_addr; strncpy(realmsg,msg,cc); realmsg[cc] = '\0'; fprintf(stdout,"From %s : %s\n", (gethostbyaddr((char *)&fromaddr, sizeof(fromaddr),AF_INET))->h_name,realmsg); ok = (realmsg[0] != '0'); } shutdown(s1,2); exit(0); default: close(s1); } } }