//implemented client for CMSC 417-0101 2011 Fall Project 2 #include #include /* for using strtok, strcmp, etc */ #include #include #include #include #include #include #include #include "common.h" #define pAssert(a,b) {if (!(a)) {printf("Line %d in File %s: %s\n", __LINE__, __FILE__, b); exit(1);}} #define pError(e,a) {if (e) {perror(a); exit(1);}} int main (int argc, char **argv) { char client_msg[MAX_STR_SIZE]; char server_msg1[MAX_STR_SIZE]; char server_msg2[MAX_STR_SIZE]; int sd; struct sockaddr_in sin; struct hostent *h; short port; char magic_str[] = MAGIC_STRING; char delims[] = "\t \n"; /* delimiters */ char *token = 0x0, *addr_string = 0x0, *rand_num_str = 0x0; int ret_val, readbytes; /* Verify command-line arguments */ if (argc < 3 || argc > 5) { printf("usage: %s [[ ]] \n", argv[0]); exit(1); } h = (argc > 3) ? gethostbyname(argv[1]) : gethostbyname(SERVER_HOSTNAME); pAssert(h, "gethostbyname failed\n"); port = (argc == 5) ? atoi(argv[2]) : SERVER_PORT; /* Allocate a socket (type SOCK_STREAM for TCP) */ sd = socket(AF_INET, SOCK_STREAM, 0); pError((sd==-1), "socket"); /* Fill in '' */ bzero((char *) &sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = *( (unsigned long *) h->h_addr); sin.sin_port = htons(port); /* Connect to the server */ ret_val = connect(sd, (struct sockaddr *) &sin, sizeof(sin)); pError(ret_val == -1, "connect"); /* Format with HELLO string */ sprintf(client_msg, "%s HELLO %s %s\n", magic_str, argv[argc-2], argv[argc-1]); /* Send HELLO to server */ send(sd, client_msg, strlen(client_msg), 0); /* Wait for server's STATUS message, read it into server_msg1 */ bzero(server_msg1, sizeof(server_msg1)); readbytes = read(sd, server_msg1, sizeof(server_msg1)-1); pError(readbytes==-1, "read"); /* server_msg1 contains the string back from the server */ token = strtok(server_msg1, delims); pAssert(token && !strcmp(token, magic_str), "STATUS message: Invalid Magic String"); token = strtok(NULL, delims); pAssert(token && !strcmp(token, "STATUS"), "STATUS message: Invalid Message Type"); token = strtok(NULL, delims); pAssert(token, "STATUS message: Random number"); rand_num_str = token; token = strtok(NULL, delims); pAssert(token, "STATUS message: Invalid IP Address string"); addr_string = token; pAssert(!strtok(NULL, delims), "STATUS message: Too many tokens"); sprintf(client_msg,"%s CLIENT_BYE %s\n", magic_str, rand_num_str); send(sd, client_msg, strlen(client_msg), 0); /* Wait for server's SERVER_BYE message, put it into */ bzero(server_msg2, sizeof(server_msg2)); readbytes = read(sd, server_msg2, sizeof(server_msg2)-1); pError(readbytes==-1, "read"); token = strtok(server_msg2, delims); pAssert(token && !strcmp(token, magic_str), "SERVER_BYE message: Invalid Magic String"); token = strtok(NULL, delims); pAssert(token && !strcmp(token, "SERVER_BYE"), "SERVER_BYE message: Invalid Message Type"); token = strtok(NULL, delims); pAssert(!strtok(NULL, delims), "SERVER_BYE message: Too many tokens"); /* close the socket and clean up */ close(sd); return 0; }