/***********************************************************
 * display server client                                   *
 * a first step towards an dsm server                      *
 * Verteilte Systeme II Kapitel 9                          *
 ***********************************************************
 * 1998 by Frank Kargl (frank.kargl@informatik.uni-ulm.de) *
 ***********************************************************
 * Usage: client <server> <port>                           *
 ***********************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

/* default port to use */
#define DEFPORT 1099
/* string for end of communication */
#define ENDOFCOM "QUIT"

/***********************************************************
 *                                                         *
 * Function:                                               *
 * void usage(char* name)                                  *
 * print usage message                                     *
 * Parameters:                                             * 
 *  name - name of executable                              *
 * Return:                                                 *
 *  -                                                      *
 *                                                         *
 ***********************************************************/

void usage(char* name) {
    printf("%s - a client for the simple display server\n", name);
    printf("Usage: %s <host> <UDP-port>\n", name);
    exit(1);
}

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

    int sock;					/* udp socket for com. */
    int port = DEFPORT;				/* port to use */
    char host[128];				/* hostname argument */
    struct sockaddr_in servaddr;		/* server data */
    struct hostent *he;				/* host entry for dns */
    char buffer[128];				/* buffer for msges */

    /* check for args */
    if (argc == 2) {
	strcpy(host, argv[1]);
    } else if (argc == 3) {
	strcpy(host, argv[1]);
	port = atoi(argv[2]);
    } else {
	usage(argv[0]);
    }

    /* create udp socket */
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock == -1) {
	perror("can't open socket");
	exit(1);
    }
    /* resolve name */
    he = gethostbyname(host);
    if (he == NULL) {
  	printf("Canīt resolve %s\n", host);
	exit(0);
    }
    memcpy(&servaddr.sin_addr, he->h_addr, sizeof (struct in_addr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    printf("Sending messages to %s:%u\n", inet_ntoa(servaddr.sin_addr), port);
    printf("Type %s to quit\n", ENDOFCOM);
    
    printf("> ");
    gets(buffer);
    while(1) {
	/* send message */
	sendto(sock, buffer, strlen(buffer), 0,
	       	(struct sockaddr *)&servaddr, sizeof(servaddr));
	if (!strncasecmp(buffer, ENDOFCOM, strlen(ENDOFCOM))) {
	    break;
	}
	printf("> ");
	gets(buffer);
    }
    
    close(sock);
    
    return 0;

}
