From Computer
Networking and Applications, Douglas Comer, Chapter 3
“To
demonstrate network programming, we have devised a straightforward API for
network communication.”
Comer’s
API is an abstraction that simplifies the so-called socket programming API. (The
socket API is the standard method applications use to enable themselves to use
an IP network.)
/*
echoclient.c */
#include
<stdlib.h>
#include
<stdio.h>
#include
<cnaiapi.h>
#define
BUFFSIZE 256
#define
INPUT_PROMPT "Input > "
#define
RECEIVED_PROMPT "Received>
"
int
readln(char *, int);
/*-----------------------------------------------------------------------
*
* Program: echoclient
* Purpose: contact echoserver, send user
input and print server response
* Usage:
echoclient <compname> [appnum]
* Note:
Appnum is optional. If not specified the standard echo appnum
*
(7) is used.
*
*-----------------------------------------------------------------------
*/
int
main(int
argc, char *argv[])
{
computer comp;
appnum app;
connection conn;
char buff[BUFFSIZE];
int expect,
received, len;
if (argc < 2 || argc > 3) {
(void) fprintf(stderr, "usage:
%s <compname> [appnum]\n",
argv[0]);
exit(1);
}
/* convert the arguments to binary format
comp and appnum */
comp = cname_to_comp(argv[1]);
if (comp == -1)
exit(1);
if (argc == 3)
app = (appnum) atoi(argv[2]);
else
if ((app =
appname_to_appnum("echo")) == -1)
exit(1);
/* form a connection with the echoserver
*/
conn = make_contact(comp, app);
if (conn < 0)
exit(1);
(void) printf(INPUT_PROMPT);
(void) fflush(stdout);
/* iterate: read input from the user, send
to the server, */
/* receive reply from the server, and display
for user */
while((len = readln(buff, BUFFSIZE)) >
0) {
/* send the input to the echoserver
*/
(void) send(conn, buff, len, 0);
(void) printf(RECEIVED_PROMPT);
(void) fflush(stdout);
/* read and print same no. of bytes
from echo server */
expect = len;
for (received = 0; received <
expect;) {
len = recv(conn, buff, (expect
- received) < BUFFSIZE ?
(expect - received) : BUFFSIZE, 0);
if (len < 0) {
send_eof(conn);
return 1;
}
(void) write(STDOUT_FILENO,
buff, len);
received += len;
}
(void) printf("\n");
(void) printf(INPUT_PROMPT);
(void) fflush(stdout);
}
/* iteration ends when EOF found on stdin
*/
(void) send_eof(conn);
(void) printf("\n");
return 0;
}