210 likes | 221 Views
Ch 3. Network Programming. Network Programming (1). Network allows arbitrary applications to communicate E.g., client-server computing such as WEB browsing GUI Functions supported data transmission via underlying network. Network Programming (2).
E N D
Network Programming (1) • Network allows arbitrary applications to communicate • E.g., client-server computing such as WEB browsing • GUI • Functions supported • data transmission via underlying network
Network Programming (2) • A programmer can create Internet application software without understanding the underlying network technology • Network facilities are accessed through an Application Program Interface (API)
Echo server • Useful for network testing • Server returns exact copy of data sent • Server: Bind port number • Client: Assign server IP (host) and port number (AP) Client Server LAN > echoserver 22000 > echoclient X 22000
A Intuitive Look at the API Client Server make_contact() send() recv() send_eof() await_contact() recv() send() send_eof()
Exercise: Files needed • CNAI API code • readln.c • send_eof.c • make_contact.c • cname_to_comp.c • cnaiapi_init.c • await_contact.c • appname_to_appnum.c • Header files • cnaiapi.h • cnaiapi_win32.h • C source code • echoserver.c • echoclient.c • Readme.txt
Build net programs under Windows (1) • Have cnaiapi.lib available • [File][New][Win32 Static Library] • Replace #include <xxx.h> with #include “xxx.h“in .c and .h files • [Project][Add to project][Fies] • Seven .c files • [Build][Build cnaiapi.lib]
Build net programs under Windows (2) • Include “cnaiapi.h” in each of the C program files that use CNAI API library calls • Link cnaiapi.lib into the program • [project] [settings] [Link tag] [general category] • including 'cnaiapi.lib‘ in the Object/Library Modules • setting the Additional Library Path in the Input Cate. • link to the WinSock 2 library (ws2_32.lib)
A Intuitive Look at the API Server Client socket() // open a TCP socket socket() assign server IP and port number bind() // bind port number listen() // connect to the specific // server connect() accept() // blocking mode read() write() write() read() closes () close ()
A Intuitive Look at the API Client Server make_contact() send() recv() send_eof() await_contact() recv() send() send_eof()
Echo client • /* 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; • }
A Intuitive Look at the API Client Server make_contact() send() recv() send_eof() await_contact() recv() send() send_eof()