/* elliottClient.c - code for example client program using TCP 
 *	Checking on 4-way handshake
 */

#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#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);

}






