/*
*   TCPclient: Internet domain, connection-oriented CLIENT
*   Author:    Taken from Gray, page 298, adapted by H. J. Hamilton
*   Date:      Last update, September 26, 2002.
*   To compile on hercules:
*	cc TCPclient.c -lsocket -lnsl -o TCPclient
*   To run using a server on hercules:
*	TCPclient hercules.cs.uregina.ca
*/

#include "local.h"

main( int argc, char *argv[] ) {

	int                       orig_sock, len;
	static struct sockaddr_in serv_adr;
	struct hostent           *host;

	if ( argc != 2 ) {
		fprintf(stderr, "usage: %s server\n", argv[0]);
		exit(1);
	}

	host = gethostbyname(argv[1]); 
	if (host == (struct hostent *) NULL ) {
		perror("gethostbyname ");
		exit(2);
	}

	memset(&serv_adr, 0, sizeof( serv_adr));  /* Clear it out  */
	serv_adr.sin_family = AF_INET;
	memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length);
	serv_adr.sin_port   = htons( PORT );

	if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {/* SOCKET  */
		perror("generate error");
		exit(3);
	}

	/* CONNECT */
	if (connect(orig_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) 
	    < 0)
	{
		perror("connect error");
		exit(4);
	}

	do 
	{
		/* Prompt the user */
		write(fileno(stdout),"> ", 3);

		/* Get user input  */
		if ((len = read(fileno(stdin), buf, BUFSIZ)) > 0) {   
			/* Write to socket */
			write(orig_sock, buf, len);                       

			/* If returned, display it */
			if ((len = read(orig_sock, buf, len)) > 0 )
				write(fileno(stdout), buf, len);
		}

	} while( buf[0] != '.' );

	close(orig_sock);
	exit(0);
}
