From eeae53d349031efdb209921e45302ecfd4c29638 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 18 Jun 2001 21:46:14 +0000 Subject: [PATCH] Rinominate le prime versioni dei vari programmi in Elem, la versione piu` evoluta diventa Simple --- ...timeTCPServer.c => ElemDaytimeTCPServer.c} | 2 +- ...DaytimeTCPClient.c => ElemEchoTCPClient.c} | 52 ++++--- sources/ElemEchoTCPServer.c | 137 ++++++++++++++++++ 3 files changed, 166 insertions(+), 25 deletions(-) rename sources/{SimpleDaytimeTCPServer.c => ElemDaytimeTCPServer.c} (97%) rename sources/{SimpleDaytimeTCPClient.c => ElemEchoTCPClient.c} (75%) create mode 100644 sources/ElemEchoTCPServer.c diff --git a/sources/SimpleDaytimeTCPServer.c b/sources/ElemDaytimeTCPServer.c similarity index 97% rename from sources/SimpleDaytimeTCPServer.c rename to sources/ElemDaytimeTCPServer.c index 9f6b9be..bffdb3a 100644 --- a/sources/SimpleDaytimeTCPServer.c +++ b/sources/ElemDaytimeTCPServer.c @@ -8,7 +8,7 @@ * * Usage: daytimed * - * $Id: SimpleDaytimeTCPServer.c,v 1.2 2001/05/19 20:47:03 piccardi Exp $ + * $Id: ElemDaytimeTCPServer.c,v 1.1 2001/06/18 21:46:14 piccardi Exp $ * ****************************************************************/ /* diff --git a/sources/SimpleDaytimeTCPClient.c b/sources/ElemEchoTCPClient.c similarity index 75% rename from sources/SimpleDaytimeTCPClient.c rename to sources/ElemEchoTCPClient.c index 069b411..97eba19 100644 --- a/sources/SimpleDaytimeTCPClient.c +++ b/sources/ElemEchoTCPClient.c @@ -1,14 +1,14 @@ /**************************************************************** * - * Program daytime_tcp_client.c: - * Simple TCP client for daytime service (port 13) + * Program SimpleEchoTCPClient: + * Simple TCP client for echo service (port 7) * * Author: Simone Piccardi - * Apr. 2001 + * Jun. 2001 * - * Usage: daytime -h give all info's + * Usage: echo -h give all info's * - * $Id: SimpleDaytimeTCPClient.c,v 1.2 2001/06/12 22:17:22 piccardi Exp $ + * $Id: ElemEchoTCPClient.c,v 1.1 2001/06/18 21:46:14 piccardi Exp $ * ****************************************************************/ /* @@ -20,18 +20,20 @@ #include /* socket library */ #include /* include standard I/O library */ -#define MAXLINE 80 -/* Program begin */ +#include "wrappers.h" + +#define MAXLINE 256 void usage(void); +void EchoClient(FILE * filein, int socket); + +/* Program begin */ int main(int argc, char *argv[]) { /* * Variables definition */ - int sock_fd; - int i, nread; + int sock_fd, i; struct sockaddr_in serv_add; - char buffer[MAXLINE]; /* * Input section: decode parameters passed in the calling * Use getopt function @@ -69,7 +71,7 @@ int main(int argc, char *argv[]) /* initialize address */ memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */ serv_add.sin_family = AF_INET; /* address type is INET */ - serv_add.sin_port = htons(13); /* daytime port is 13 */ + serv_add.sin_port = htons(7); /* echo port is 7 */ /* build address using inet_pton */ if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) { perror("Address creation error"); @@ -81,23 +83,12 @@ int main(int argc, char *argv[]) return -1; } /* read daytime from server */ - while ( (nread = read(sock_fd, buffer, MAXLINE)) > 0) { - buffer[nread]=0; - if (fputs(buffer, stdout) == EOF) { /* write daytime */ - perror("fputs error"); - return -1; - } - } - /* error on read */ - if (nread < 0) { - perror("Read error"); - return -1; - } + EchoClient(stdin, sock_fd); /* normal exit */ return 0; } /* - * routine to print usage info and exit + * routine to print usage info and exit */ void usage(void) { printf("Take daytime from a remote host \n"); @@ -107,3 +98,16 @@ void usage(void) { printf(" -h print this help\n"); exit(1); } + +void EchoClient(FILE * filein, int socket) +{ + char sendbuff[MAXLINE], recvbuff[MAXLINE]; + int nread; + while (fgets(sendbuff, MAXLINE, filein) != NULL) { + SockWrite(socket, sendbuff, strlen(sendbuff)); + nread = SockRead(socket, recvbuff, strlen(sendbuff)); + recvbuff[nread] = 0; + fputs(recvbuff, stdout); + } + return; +} diff --git a/sources/ElemEchoTCPServer.c b/sources/ElemEchoTCPServer.c new file mode 100644 index 0000000..f7a1a41 --- /dev/null +++ b/sources/ElemEchoTCPServer.c @@ -0,0 +1,137 @@ +/**************************************************************** + * + * Program echo_tcp_server.c: + * Elementary TCP server for echo service (port 7) + * + * Author: Simone Piccardi + * Jun. 2001 + * + * Usage: echod + * + * $Id: ElemEchoTCPServer.c,v 1.1 2001/06/18 21:46:14 piccardi Exp $ + * + ****************************************************************/ +/* + * Include needed headers + */ +#include /* predefined types */ +#include /* include unix standard library */ +#include /* IP addresses conversion utiliites */ +#include /* socket library */ +#include /* include standard I/O library */ +#include + +#include "wrappers.h" + +#define BACKLOG 10 +#define MAXLINE 256 + +/* Subroutines declaration */ +void usage(void); +void SockEcho(int sockfd); +/* Program beginning */ +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int list_fd, conn_fd; + pid_t pid; + struct sockaddr_in serv_add; + /* + * Input section: decode parameters passed in the calling + * Use getopt function + */ + int i; + opterr = 0; /* don't want writing to stderr */ + while ( (i = getopt(argc, argv, "h")) != -1) { + switch (i) { + /* + * Handling options + */ + case 'h': + printf("Wrong -h option use\n"); + usage(); + return(0); + break; + case '?': /* unrecognized options */ + printf("Unrecognized options -%c\n",optopt); + usage(); + default: /* should not reached */ + usage(); + } + } + /* *********************************************************** + * + * Options processing completed + * + * Main code beginning + * + * ***********************************************************/ + /* create socket */ + if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation error"); + exit(-1); + } + /* initialize address */ + memset((void *)&serv_add, 0, sizeof(serv_add)); /* clear server address */ + serv_add.sin_family = AF_INET; /* address type is INET */ + serv_add.sin_port = htons(7); /* echo port is 7 */ + serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */ + /* bind socket */ + if (bind(list_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) { + perror("bind error"); + exit(-1); + } + /* listen on socket */ + if (listen(list_fd, BACKLOG) < 0 ) { + perror("listen error"); + exit(-1); + } + /* handle echo to client */ + while (1) { + /* accept connection */ + if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) { + perror("accept error"); + exit(-1); + } + /* fork to handle connection */ + if ( (pid = fork()) < 0 ){ + perror("fork error"); + exit(-1); + } + if (pid == 0) { /* child */ + close(list_fd); /* close listening socket */ + SockEcho(conn_fd); /* handle echo */ + exit(0); + } else { /* parent */ + close(conn_fd); /* close connected socket */ + } + } + /* normal exit, never reached */ + exit(0); +} +/* + * routine to print usage info and exit + */ +void usage(void) { + printf("Simple daytime server\n"); + printf("Usage:\n"); + printf(" daytimed [-h] \n"); + printf(" -h print this help\n"); + exit(1); +} +/* + * routine to handle echo for connection + */ +void SockEcho(int sockfd) { + char buffer[MAXLINE]; + int nread, nwrite; + + /* main loop, reading 0 char means client close connection */ + while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) { + printf("Letti %d bytes, %s ", nread, buffer); + nwrite = SockWrite(sockfd, buffer, nread); + } + return; +} -- 2.30.2