.. /************************************************************ tcpechoserver.c This is a concurrent echo server (it echos all input back to the client), using tcp protocols. Copyright (C) 1995 by Fred Sullivan All Rights Reserved Changes by Richard Rabbat, Feb. 1999 ************************************************************/ #include #include #include #include #include #define PORT 5503 #define QUEUELENGTH 5 void fatalerror(char* executable, char* message) { fprintf(stderr, "%s: %s\n", executable, message); perror(executable); fflush(stdout); exit(1); } void print_address (int tempaddr) { int addr1, addr2, addr3, addr4; /* calculate address in terms of num1.num2.num3.num4 */ addr1 = tempaddr/256/256/256; tempaddr -= addr1*256*256*256; addr2 = tempaddr/256/256; tempaddr -= addr2*256*256; addr3 = tempaddr/256; addr4 = tempaddr - addr3*256; /* print it out */ fprintf(stderr, "Accepted connect request from %d.%d.%d.%d\n", addr1, addr2, addr3, addr4); } main(int argc, char *argv[]) { int sockfd, newsockfd; struct sockaddr_in clientaddr, serveraddr; int clientaddrlength; int pid; char* executable, c; int mul; /* Remember the program name for error messages. */ executable = argv[0]; /* Open a TCP socket. */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) fatalerror(executable, "can't open socket"); /* Bind the address to the socket. */ bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(PORT); if (bind(sockfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) != 0) fatalerror(executable, "can't bind to socket"); if (listen(sockfd, QUEUELENGTH) < 0) fatalerror(executable, "can't listen"); while (1) { /* Wait for a connection. */ clientaddrlength = sizeof(clientaddr); newsockfd = accept(sockfd, (struct sockaddr *) &clientaddr, &clientaddrlength); print_address(clientaddr.sin_addr.s_addr); if (newsockfd < 0) fatalerror(executable, "accept failure"); /* Fork a child to handle the connection. */ pid = fork(); if (pid < 0) fatalerror(executable, "fork error"); else if (pid == 0) { /* I'm the child. */ close(sockfd); while (read(newsockfd, &c, 1) == 1) c = 'a'; /* Echo the character. */ if (write(newsockfd, &c, 1) != 1) fatalerror(executable, "can't write to socket"); exit(EXIT_SUCCESS); } else /* I'm the parent. */ close(newsockfd); } } /************************************************************ tcpechoclient.c This is a client for the tcp echo server. It sends anything read from standard input to the server, reads the responses, and sends them to standard output. Copyright (C) 1995 by Fred Sullivan All Rights Reserved Changes 1999, Richard Rabbat ************************************************************/ #include #include #include #include #include #include #define PORT 5503 void fatalerror(char* executable, char* message) { fprintf(stderr, "%s: %s\n", executable, message); perror(executable); fflush(stdout); exit(1); } main(int argc, char *argv[]) { int sockfd, c; struct sockaddr_in serveraddr; char *executable, *server, outbuffer, inbuffer; struct hostent *hp; /* Remember the program name for error messages. */ executable = argv[0]; /* find server */ if (argc == 2) server = argv[1]; else fatalerror (executable, "need name of server"); /* look up specified server hostname */ bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_addr.s_addr = inet_addr(server); if ((hp = gethostbyname(server)) == NULL) { fprintf (stderr, "%s: %s: no such host?/n", executable, server); exit (1); } /* put host's address and address type in socket structure */ bcopy (hp->h_addr, & serveraddr.sin_addr, hp->h_length); serveraddr.sin_family = hp->h_addrtype; serveraddr.sin_port = htons(PORT); /* Open a socket. */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) fatalerror(executable, "can't open socket"); /* Connect to the server. */ if (connect(sockfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) fatalerror(executable, "can't connect to server"); fprintf (stderr, "type stuff to get it echoed back\n"); /* Copy input to the server. */ while ((c = getchar()) != EOF) { /* Write a character to the socket. */ outbuffer = c; if (write(sockfd, &outbuffer, 1) != 1) fatalerror(executable, "can't write to socket"); /* Read the response and print it. */ if (read(sockfd, &inbuffer, 1) != 1) fatalerror(executable, "can't read from socket"); putchar(inbuffer); } close(sockfd); exit(EXIT_SUCCESS); } /************************************************************ udpechoserver.c This is a concurrent echo server (it echos all input back to the client), using tcp protocols. Copyright (C) 1995 by Fred Sullivan All Rights Reserved Changes by Richard Rabbat, Feb. 1999 ************************************************************/ #include #include #include #include #include #define PORT 5501 #define QUEUELENGTH 5 void fatalerror(char* executable, char* message) { fprintf(stderr, "%s: %s\n", executable, message); perror(executable); fflush(stdout); exit(1); } void print_address (int tempaddr) { int addr1, addr2, addr3, addr4; /* calculate address in terms of num1.num2.num3.num4 */ addr1 = tempaddr/256/256/256; tempaddr -= addr1*256*256*256; addr2 = tempaddr/256/256; tempaddr -= addr2*256*256; addr3 = tempaddr/256; addr4 = tempaddr - addr3*256; /* print it out */ fprintf(stderr, "Accepted connect request from %d.%d.%d.%d\n", addr1, addr2, addr3, addr4); } main(int argc, char *argv[]) { int sockfd, newsockfd; struct sockaddr_in clientaddr, serveraddr; int clientaddrlength; int pid; char* executable, c; /* Remember the program name for error messages. */ executable = argv[0]; /* Open a TCP socket. */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) fatalerror(executable, "can't open socket"); /* Bind the address to the socket. */ bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(PORT); if (bind(sockfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) != 0) fatalerror(executable, "can't bind to socket"); while (1) { /* Wait for a connection. */ clientaddrlength = sizeof(clientaddr); if (recvfrom(sockfd, &c, 1, 0, (struct sockaddr *) &clientaddr, &clientadd rlength) != 1) fatalerror (executable, "can't read from socket"); /* Echo the character. */ if (sendto(sockfd, &c, 1, 0, (struct sockaddr *) &clientaddr, clientaddrle ngth) != 1) fatalerror(executable, "can't write to socket"); } close (sockfd); } /************************************************************ tcpechoclient.c This is a client for the tcp echo server. It sends anything read from standard input to the server, reads the responses, and sends them to standard output. Copyright (C) 1995 by Fred Sullivan All Rights Reserved Changes 1999, Richard Rabbat ************************************************************/ #include #include #include #include #include #include #define PORT 5501 void fatalerror(char* executable, char* message) { fprintf(stderr, "%s: %s\n", executable, message); perror(executable); fflush(stdout); exit(1); } main(int argc, char *argv[]) { int sockfd, c; struct sockaddr_in serveraddr; char *executable, *server, outbuffer, inbuffer; struct hostent *hp; int serveraddrlength; /* Remember the program name for error messages. */ executable = argv[0]; /* find server */ if (argc == 2) server = argv[1]; else fatalerror (executable, "need name of server"); /* look up specified server hostname */ serveraddr.sin_addr.s_addr = inet_addr(server); /* if ((hp = gethostbyname (server)) == NULL) {*/ if ((hp = gethostbyaddr ((void*)&(serveraddr.sin_addr), 4, AF_INET)) == NULL) { fprintf (stderr, "%s: %s: no such host?/n", executable, server); exit (1); } /* put host's address and address type in socket structure */ bcopy (hp->h_addr, & serveraddr.sin_addr, hp->h_length); serveraddr.sin_family = hp->h_addrtype; serveraddr.sin_port = htons(PORT); /* Open a socket. */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) fatalerror(executable, "can't open socket"); serveraddrlength = sizeof(serveraddr); /* Copy input to the server. */ while ((c = getchar()) != EOF) { /* Write a character to the socket. */ outbuffer = c; if (sendto(sockfd, &outbuffer, 1, 0, &serveraddr, sizeof(serveraddr))!=1) fatalerror(executable, "can't write to socket"); /* Read the response and print it. */ if (recvfrom(sockfd, &inbuffer, 1, 0, &serveraddr, &serveraddrlength)!=1) fatalerror(executable, "can't read from socket"); putchar(inbuffer); } close(sockfd); exit(EXIT_SUCCESS);