SOURCE FILE: chatclient.c


/* chatclient.c */

#include <stdlib.h>
#include <stdio.h>
#include <cnaiapi.h>

#define BUFFSIZE		256
#define INPUT_PROMPT		"Input   > "
#define RECEIVED_PROMPT		"Received> "

int recvln(connection, char *, int);
int readln(char *, int);

/*-----------------------------------------------------------------------
 *
 * Program: chatclient
 * Purpose: contact a chatserver and allow users to chat
 * Usage:   chatclient <compname> <appnum>
 *  NOTE: CLIENT MUST SPECIFY HOST AND PORT. 
 *-----------------------------------------------------------------------
 */
int
main(int argc, char *argv[])
{
	computer	comp;
	connection	conn;
	char		buff[BUFFSIZE];
	int		len;

	if (argc != 3) { /* ERROR OUT IF #ARGS WRONG */
		(void) fprintf(stderr, "usage: %s <compname> <appnum>\n",
			       argv[0]);
		exit(1);
	}

	/* convert the compname to binary form comp 
           -- i.e. CONVERT HOSTNAME TO NUMERIC VALUE. */
	comp = cname_to_comp(argv[1]);
	if (comp == -1)
		exit(1);

	/* make a connection to the chatserver 
           -- NOTE: comp IS THE CONVERTED HOSTNAME 
           AND argv[2] IS THE PORT NUMBER */

	conn = make_contact(comp, (appnum) atoi(argv[2]));
	if (conn < 0) 
		exit(1); /* IF ERROR, EXIT. */

                 /* PROMPT THE USER FOR A LINE */
	(void) printf("Chat Connection Established.\n");
	(void) printf(INPUT_PROMPT);
	(void) fflush(stdout);

	/* iterate, reading from local user and then from chatserver
           -- THE EXPRESSION INSIDE THE while READS THE LINE
           FROM THE USER. THE EXPRESSION HAS VALUE 'TRUE' 
           IF (and only if) A POSITIVE NUMBER OF CHARACTERS IS READ. 
           NOTICE THAT BECAUSE OF THE LOOP CONDITION AND THE BREAK STATEMENT
           INSIDE THE LOOP BODY, THE LOOP IS RIGGED TO STOP IF EITHER
           SIDE ENTERS EOF. */

	while((len = readln(buff, BUFFSIZE)) > 0) {
		buff[len - 1] = '\n'; /* ASSURE LAST CHAR IS eoln */
		(void) send(conn, buff, len, 0); /* SEND LINE OVER CONNECTION */
		
		/* receive and print a line from the chatserver 
                   -- BREAK IF ZERO CHARACTERS ARE RECEIVED
                      (JUMP OUT OF THE LOOP) */
		if ((len = recvln(conn, buff, BUFFSIZE)) < 1)
			break;
                       /* WRITE THE LINE RECEIVED FROM THE SERVER
                          AND PROMPT FOR ANOTHER FROM THE CLIENT USER. */
		(void) printf(RECEIVED_PROMPT);
		(void) fflush(stdout);
		(void) write(STDOUT_FILENO, buff, len);

		(void) printf(INPUT_PROMPT);
		(void) fflush(stdout);
	}

	/* iteration ends when stdin or the connection indicates EOF */

	(void) printf("\nChat Connection Closed.\n");
	(void) send_eof(conn);
	exit(0);
}