#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; unsigned short port; char magic_str[] = MAGIC_STRING; char delims[] = "\t \n"; /* delimiters */ char *token = 0x0, *addr_string = 0x0, *rand_num_str = 0x0; /* 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(...); pError((sd==-1), "socket"); /* Fill in '' */ // bzero((char *) &sin, sizeof(sin)); // sin.sin_family = // sin.sin_addr.s_addr = // sin.sin_port = /* Connect to the server */ /* Format with HELLO string */ sprintf(client_msg, "%s HELLO %s %s\n", magic_str, argv[argc-2], argv[argc-1]); // send client_msg to server /* Wait for server's STATUS message, read it into server_msg1 */ /* server_msg1 contains the string back from the server */ token = strtok(server_msg1, delims); pAssert(token && !strcmp(token, magic_str), "Invalid Magic String"); token = strtok(NULL, delims); pAssert(token && !strcmp(token, "STATUS"), "Invalid Message Type"); token = strtok(NULL, delims); pAssert(token, "Random number"); rand_num_str = token; token = strtok(NULL, delims); pAssert(token, "Invalid IP Address string"); addr_string = token; pAssert(!strtok(NULL, delims), "Too many tokens"); sprintf(client_msg,"%s CLIENT_BYE %s\n", magic_str, rand_num_str); // send client_msg to server /* Wait for server's SERVER_BYE message, put it into */ token = strtok(server_msg2, delims); pAssert(token && !strcmp(token, magic_str), "Invalid Magic String"); token = strtok(NULL, delims); pAssert(token && !strcmp(token, "SERVER_BYE"), "Invalid Message Type"); token = strtok(NULL, delims); pAssert(!strtok(NULL, delims), "Too many tokens"); /* close the socket and clean up */ close(sd); return 0; }