/* elliottClient.c - code for example client program using TCP * Checking on 4-way handshake */ #define closesocket close #include #include #include #include #include #include #include #include #include #include #define PROTOPORT 8765 /*default protocol port number*/ extern int errno; char localhost[] = "localhost"; /*default host name */ /**************************************************************** * Program: client * Purpose: Allocate a socket, connect to a server, and print all output * Syntax: client [host [port]] * host: name of computer on which server is executing * port:protocol port number server is using * Note: Both arguments are optional. If no host name is specified * the client uses "localhost"; if no protocol port is * specified, the client uses the default given by PROTOPORT. ****************************************************************/ int main(int argc, char *argv[]) { struct hostent *ptrh; /* pointer to a host table entry */ struct sockaddr_in sad;/* structure to hold server's address*/ int sd; /* socket descriptor */ int port; /* protocol port number */ char *host; /* pointer to host name */ int n; /* number of characters read */ char buf[1000]; /* buffer for data from the server */ int option_value; /* GPI: needed for setsockopt */ memset((char *)&sad, 0, sizeof(sad)); /* clear sockaddr structure */ sad.sin_family = AF_INET; /* set family to Internet */ /* Check command-line argument for protocol port and extract * port number if one is specified. Otherwise, use the default * port value given by constant PROTOPORT */ if (argc > 2) { /* If protocol port is specified */ port = atoi(argv[2]);/* Convert to binary */ } else { port = PROTOPORT; /* use default port number */ } if (port > 1024) /* Test for legal value */ sad.sin_port = htons((u_short)port); else { /* Print error message and exit */ fprintf(stderr,"bad port number %s\n", argv[2]); exit(1); } /* Check host argument and assign host name */ if (argc > 1) { host = argv[1]; /* If host argument is specified */ } else { host = localhost; } /* Convert host name to equivalent IP address and copy sad */ ptrh = gethostbyname(host); if (((char *)ptrh) == NULL) { fprintf(stderr, "invalid host: %s\n", host); exit(1); } memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length); /* Create a socket */ sd = socket(PF_INET, SOCK_STREAM, 0); if (sd < 0) { fprintf(stderr, "socket creation failed\n"); exit(1); } option_value = 1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&option_value, sizeof(option_value)) < 0) { perror("setsockopt"); exit(1); } /* Connect the socket to the specified server */ if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) { fprintf(stderr, "connect failed\n"); exit(1); } /* Read data from socket and write to user's screen */ n = read(sd, buf, sizeof(buf)); write(1, buf, n); /* Repeatedly write data to socket */ int message = 10000; int rc; while (1) { sprintf(buf, "here is %d", message++); rc = write(sd, buf, strlen(buf)); if (rc < 0) break; } printf("%d\n", message); /* Close socket */ close(sd); /* Terminate client program gracefully */ return (0); }