pluto% nl echo_seru.c | sed "s/^I/ /g" | sed "s/ //" 1 /* echo_seru.c 2 This program illustrates an iterative version echo server using UDP 3 Algorithm outline 4 a. Open a UDP socket 5 b. Initialize server socket address structure 6 c. Bind SER_PORT and INADDR_ANY (wildcard address) to the open socket 7 (SER_PORT = 49495, an arbitrary number > 49151) 8 (INADDR_ANY accepts a client connection from any NW interface) 9 d. Wait for a datagram from a client 10 e. Send response back to client 11 f. Go back to d. 12 This program also shows: 13 a. How to zero out a structure (bzero()) 14 b. Host to network byte order conversion short (htons()) 15 c. Host to network byte order conversion long (htonl()) 16 d. Use of recvfrom() 17 e. Use of sendto() 18 Be aware that recvfrom() and sendto() return values of ssize_t 19 To compile: gcc -o echo_seru echo_seru.c 20 Command syntax: echo_seru & 21 Sam Hsu 22 */ 23 #include 24 #include 25 #include 26 #include 27 #include 28 #define SER_PORT 49495 /* arbitrary; official echo server port is 7 */ 29 main() 30 { 31 int ser_sock, ser_len, cli_len; 32 ssize_t nread; 33 char buf[BUFSIZ]; 34 struct sockaddr_in ser, cli; 35 /* to open a socket */ 36 if ((ser_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 37 fprintf(stderr, "Unable to create server socket\n"); 38 exit(1); 39 } 40 /* to initialize server sockaddr_in structure */ 41 ser_len = sizeof(ser); /* to get ser socket struct length */ 42 bzero((char *)&ser, ser_len); /* to zero out struct */ 43 ser.sin_family = AF_INET; /* Internet domain */ 44 ser.sin_port = htons(SER_PORT); /* echo server port */ 45 ser.sin_addr.s_addr = htonl(INADDR_ANY); /* any network interface */ 46 /* to bind open socket to an IPaddr/service port pair */ 47 if ((bind(ser_sock, (struct sockaddr *)&ser, ser_len)) == -1) { 48 fprintf(stderr, "Unable to bind to service port for server\n"); 49 exit(1); 50 } 51 /* to wait for datagrams from clients, 1 at a time */ 52 for (;;) { /* run forever till terminated manually */ 53 cli_len = sizeof(cli); 54 nread = recvfrom(ser_sock, buf, BUFSIZ, 0, /* wait for client */ 55 (struct sockaddr *)&cli, &cli_len); 56 if (nread == (ssize_t)-1) { 57 fprintf(stderr, "recvfrom() failed\n"); 58 exit(1); 59 } 60 sendto(ser_sock, buf, (size_t)nread, 0, /* echo back to client */ 61 (struct sockaddr *)&cli, cli_len); 62 } 63 /* close(ser_sock); /* close server socket */ 64 /* return(0); /* currently not reachable */ 65 } /* main */ # to invoke the server pluto% echo_seru & [1] 9963 # to wait for client requests (Nothing to display) # to terminate the server pluto% kill -9 9963 [1] Killed echo_seru pluto% num echo_cliu.c 1 /* echo_cliu.c 2 This the client program for echo_seru.c 3 Algorithm outline: 4 a. Open a UDP client socket. 5 b. Initialize server socket address structure 6 c. Send user input to server 7 d. Display server response on screen 8 e. Close socket. 9 This program also illustrates: 10 a. Use of gethostbyname() to get some infor. on intended server. 11 b. Use of bcopy() to copy an element into a structure. 12 To compile: gcc -o echo_cliu echo_cliu.c 13 Command syntax: echo_cliu server_name (either DNS or IP) 14 Sam Hsu 15 */ 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #define SER_PORT 49495 /* arbitrary; official echo server port is 7 */ 23 main(int argc, char *argv[]) 24 { 25 int cli_sock, ser_len; 26 ssize_t nread; 27 char buf[BUFSIZ]; 28 struct sockaddr_in ser; 29 struct hostent *ser_info; 30 /* to open a socket */ 31 if ((cli_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 32 fprintf(stderr, "Unable to create socket for client\n"); 33 exit(1); 34 } 35 /* to initialize server sockaddr_in structure */ 36 ser_len = sizeof(ser); /* to get ser length */ 37 bzero((char *)&ser, ser_len); /* to zero out struct */ 38 ser.sin_family = AF_INET; /* Internet domain */ 39 ser.sin_port = htons(SER_PORT); /* echo server port number */ 40 /* to get some infor about the remote server */ 41 if ((ser_info = gethostbyname(argv[1])) == (struct hostent *)NULL) { 42 fprintf(stderr, "unknown server\n"); 43 exit(1); 44 } 45 bcopy((char *)ser_info->h_addr, (char *)&ser.sin_addr, ser_info->h_length); 46 /* to send user input to server */ 47 nread = read(STDIN_FILENO, buf, BUFSIZ); /* get input from stdin */ 48 nread = sendto(cli_sock, buf, nread, 0, /* send data to server */ 49 (struct sockaddr *)&ser, ser_len); 50 /* to get and display server response */ 51 nread = recvfrom(cli_sock, buf, BUFSIZ, 0, /* get server response */ 52 (struct sockaddr *)&ser, &ser_len); 53 if (nread == (ssize_t)-1) { 54 fprintf(stderr, "recvfrom() failed\n"); 55 exit(1); 56 } 57 write(STDOUT_FILENO, buf, (size_t)nread); /* display on screen */ 58 close(cli_sock); 59 } /* main */ # to invoke a client reality% echo_cliu pluto.cse.fau.edu Hello World! # user input; denotes carriage return Hello World! # response back from remote server pluto% num echo_ser.c 1 /* echo_ser.c 2 This program illustrates an iterative version echo server using TCP 3 Algorithm outline 4 a. Open a TCP socket 5 b. Initialize server socket address structure 6 c. Bind SER_PORT and INADDR_ANY to the open socket 7 (SER_PORT = 49494, an arbitrary number > 49151) 8 (INADDR_ANY accepts a client connection from any NW interface) 9 d. Create a queue to hold client requests 10 e. Wait for connection request from a client 11 f. Get data from client 12 g. Send response back to client 13 h. Close client connection 14 i. Go back to e. 15 This program also shows: 16 a. How to zero out a structure (bzero()) 17 b. Host to network byte order conversion short (htons()) 18 c. Host to network byte order conversion long (htonl()) 19 d. Use of recv(), which is read() + options 20 e. Use of send(), which is write() + options 21 Be aware that recv() and send() return values of ssize_t 22 To compile: gcc -o echo_ser echo_ser.c 23 Command syntax: echo_ser & 24 Sam Hsu 25 */ 26 #include 27 #include 28 #include 29 #include 30 #define LISTENQ 5 /* max connections the kernel should queue */ 31 #define SER_PORT 49494 /* arbitrary; official echo server port is 7 */ 32 main() 33 { 34 int ser_sock, cli_sock, ser_len, cli_len; 35 ssize_t nread; 36 char buf[BUFSIZ]; 37 struct sockaddr_in ser, cli; 38 /* to open a socket */ 39 if ((ser_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 40 fprintf(stderr, "Unable to create server socket\n"); 41 exit(1); 42 } 43 /* to initialize server sockaddr_in structure */ 44 ser_len = sizeof(ser); /* to get ser socket struct length */ 45 bzero((char *)&ser, ser_len); /* to zero out struct */ 46 ser.sin_family = AF_INET; /* Internet domain */ 47 ser.sin_port = htons(SER_PORT); /* echo server port */ 48 ser.sin_addr.s_addr = htonl(INADDR_ANY); /* any NW interface */ 49 /* to bind open socket to an IPaddr/service port pair */ 50 if ((bind(ser_sock, (struct sockaddr *)&ser, ser_len)) == -1) { 51 fprintf(stderr, "Unable to bind to service port for server\n"); 52 exit(1); 53 } 54 /* to place the socket in passive mode */ 55 if (listen(ser_sock, LISTENQ)) { /* to create a connection request Q */ 56 fprintf(stderr, "Unable to create a client request queue\n"); 57 exit(1); /* listen() does not fail frequent */ 58 } 59 /* to wait for connection requests from clients, 1 at a time */ 60 for (;;) { /* run forever till terminated manually */ 61 cli_len = sizeof(cli); 62 cli_sock = accept(ser_sock, (struct sockaddr *)&cli, &cli_len); 63 /* accept() blocks until a client connection request arrives */ 64 if (cli_sock == -1) { 65 fprintf(stderr, "accept() failed\n"); 66 exit(1); 67 } 68 nread = recv(cli_sock, buf, BUFSIZ, 0); /* read from client */ 69 if (nread == (ssize_t)-1) { 70 fprintf(stderr, "read() failed\n"); 71 exit(1); 72 } 73 send(cli_sock, buf, (size_t)nread, 0); /* write back to client */ 74 close(cli_sock); /* close client connection */ 75 } 76 /* close(ser_sock); /* close server socket */ 77 /* return(0); /* currently not reachable */ 78 } /* main */ # to invoke the server (Note: User input is in bold) pluto% echo_ser & [1] 11969 # to wait for client requests (Nothing to display) # to terminate the server pluto% kill -9 11969 [1] Killed echo_seru pluto% num echo_cli.c 1 /* echo_cli.c 2 This the client program for echo_ser.c 3 Algorithm outline: 4 a. Open a TCP socket. 5 b. Initialize server socket address structure 6 c. Connect to server 7 d. Send user input to server 8 e. Display server response on screen 9 f. Notify server of intent to close 10 g. Close socket. 11 This program also illustrates: 12 a. Use of gethostbyname() to get some infor. on intended server. 13 b. Use of bcopy() to copy an element into a structure. 14 c. Use of shutdow() to notify server of closing WRITE end. 15 To compile: gcc -o echo_cli echo_cli.c 16 Command syntax: echo_cli server_name (either DNS or IP) 17 Sam Hsu 18 */ 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #define SER_PORT 49494 /* arbitrary; official echo server port is 7 */ 26 main(int argc, char *argv[]) 27 { 28 int cli_sock, ser_len, port_number; 29 ssize_t nread; 30 char buf[BUFSIZ]; 31 struct sockaddr_in ser; 32 struct hostent *ser_info; 33 /* to open a socket */ 34 if ((cli_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 35 fprintf(stderr, "Unable to create socket for client\n"); 36 exit(1); 37 } 38 /* to initialize server sockaddr_in structure */ 39 ser_len = sizeof(ser); /* to get ser length */ 40 bzero((char *)&ser, ser_len); /* to zero out struct */ 41 ser.sin_family = AF_INET; /* Internet domain */ 42 ser.sin_port = htons(SER_PORT); /* echo server port number */ 43 /* to get some infor about the remote server */ 44 if ((ser_info = gethostbyname(argv[1])) == (struct hostent *)NULL) { 45 fprintf(stderr, "unknown server\n"); 46 exit(1); 47 } 48 bcopy((char *)ser_info->h_addr, (char *)&ser.sin_addr, ser_info->h_length); 49 /* to connect to server */ 50 if ((connect(cli_sock, (struct sockaddr *)&ser, ser_len)) == -1) { 51 fprintf(stderr, "can't connect to server\n"); 52 exit(1); 53 } 54 nread = read(STDIN_FILENO, buf, BUFSIZ); /* get input from stdin */ 55 send(cli_sock, buf, (size_t)nread, 0); /* send data to server */ 56 shutdown(cli_sock, SHUT_WR); /* notify server of no more data */ 57 /* for illustration, not needed */ 58 nread = recv(cli_sock, buf, BUFSIZ, 0); /* read response from server */ 59 if (nread >= 0) /* if some data received */ 60 write(STDOUT_FILENO, buf, (size_t)nread); /* display it on screen */ 61 close(cli_sock); 62 } /* main */ # to invoke from different clients reality% echo_cli pluto.cse.fau.edu Greetings from Sam # user input; denotes carriage return Greetings from Sam # response back from remote server trout% echo_cli 131.91.160.21 How are you doing? How are you doing? pluto% num byteorder.c 1 /* byteorder.c 2 This program illustrates how to determine host byte order. 3 Algorithm outline: 4 a. Get a union to hold a short integer. 5 b. Assign 0x0102 to the integer part of the union. 6 . Assume that a short integer is of 2 bytes in length. 7 c. Test to see the order of the values stored in the char array part. 8 . A char is a short int in c. 9 Note: This program is derived from an example on p. 78 of Steven's 10 UNIX Network Programming, Volume 1, 3rd ed. 11 Sam Hsu 12 */ 13 int main(int argc, char **argv) 14 { 15 union { 16 short i; 17 char ci[sizeof(short)]; 18 } si; 19 si.i = 0x0102; 20 if (sizeof(short) == 2) { 21 if (si.ci[0] == 1 && si.ci[1] == 2) 22 printf("big-endian\n"); 23 else if (si.ci[0] == 2 && si.ci[1] == 1) 24 printf("little-endian\n"); 25 else 26 printf("unknown byte ordering\n"); 27 } 28 exit(0); 29 } pluto% byteorder big-endian