210 likes | 225 Views
Learn how networks allow applications to communicate and create internet software without deep network knowledge using APIs. Practice building and testing network programs under Windows. Explore an insightful look at the API functions.
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()