CMPSC 311- Introduction to Systems Programming Module: Network Programming

Similar documents
CMPSC 311- Introduction to Systems Programming Module: Network Programming

CSE 333 Lecture 16 - network programming intro

CSE 333 Lecture network programming intro

CSE 333 Section 3. Thursday 12 April Thursday, April 12, 12

CSE 333 SECTION 7. C++ Virtual Functions and Client-Side Network Programming

CSE 333 SECTION 7. Client-Side Network Programming

CSE 333 SECTION 8. Sockets, Network Programming

CSE 333 SECTION 6. Networking and sockets

CSE 333 Lecture 8 - file and network I/O

IP Addresses, DNS. CSE 333 Summer Teaching Assistants: Renshu Gu William Kim Soumya Vasisht

IP Addresses, DNS. CSE 333 Spring Instructor: Justin Hsia

Socket Programming TCP UDP

Hyo-bong Son Computer Systems Laboratory Sungkyunkwan University

Tutorial on Socket Programming

Sockets. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

CSE 124 Discussion Section Sockets Programming 10/10/17

PA #2 Reviews. set_name, get_name, del_name. Questions? Will be modified after PA #4 ~

CSE 333 SECTION 7. Client-Side Network Programming

CSC209H Lecture 9. Dan Zingaro. March 11, 2015

Socket Programming. #In the name of Allah. Computer Engineering Department Sharif University of Technology CE443- Computer Networks

Oral. Total. Dated Sign (2) (5) (3) (2)

Processes communicating. Network Communication. Sockets. Addressing processes 4/15/2013

CSE 333 Section 8 - Client-Side Networking

Socket Programming for TCP and UDP

UNIX Sockets. Developed for the Azera Group By: Joseph D. Fournier B.Sc.E.E., M.Sc.E.E.

CLIENT-SIDE PROGRAMMING

Network Programming in C: The Berkeley Sockets API. Networked Systems 3 Laboratory Sessions

Sockets. Dong-kun Shin Embedded Software Laboratory Sungkyunkwan University Embedded Software Lab.

9/13/2007. Motivations for Sockets What s in a Socket? Working g with Sockets Concurrent Network Applications Software Engineering for Project 1

The Berkeley Sockets API. Networked Systems Architecture 3 Lecture 4

Sockets. Dong-kun Shin Embedded Software Laboratory Sungkyunkwan University Embedded Software Lab.

CSMC 412. Computer Networks Prof. Ashok K Agrawala Ashok Agrawala Set 2. September 15 CMSC417 Set 2 1

Networked Applications: Sockets. Goals of Todayʼs Lecture. End System: Computer on the ʻNet. Client-server paradigm End systems Clients and servers

Computer Networks Prof. Ashok K. Agrawala

Lecture 2. Outline. Layering and Protocols. Network Architecture. Layering and Protocols. Layering and Protocols. Chapter 1 - Foundation

Systems software design NETWORK COMMUNICATIONS & RPC SYSTEMS

CS 43: Computer Networks. 05: Socket Programming September 12-14, 2018

Networked Applications: Sockets. End System: Computer on the Net

Network Communication

MSc Integrated Electronics Networks Assignment. Investigation of TCP/IP Sockets and Ports. Gavin Cameron

CS321: Computer Networks Introduction to Application Layer

Group-A Assignment No. 6

sottotitolo Socket Programming Milano, XX mese 20XX A.A. 2016/17 Federico Reghenzani

Hybrid of client-server and P2P. Pure P2P Architecture. App-layer Protocols. Communicating Processes. Transport Service Requirements

Ports under 1024 are often considered special, and usually require special OS privileges to use.

Network Programming in C. Networked Systems 3 Laboratory Sessions and Problem Sets

TCP: Three-way handshake

Chapter 6. The Transport Layer. Transport Layer 3-1

Introduction to Socket Programming

Socket Programming. CSIS0234A Computer and Communication Networks. Socket Programming in C

Unix Network Programming

Client-server model The course that gives CMU its Zip! Network programming Nov 27, Using ports to identify services.

CS 428/528 Computer Networks Lecture 01. Yan Wang

Sockets 15H2. Inshik Song

CS 640: Computer Networking

Computer Network Programming

Socket Programming(2/2)

CS118 Discussion 1B, Week 1. Taqi Raza BUNCHE 1209B, Fridays 12:00pm to 1:50pm

Review. Preview. Closing a TCP Connection. Closing a TCP Connection. Port Numbers 11/27/2017. Packet Exchange for TCP Connection

Outline. Distributed Computing Systems. Socket Basics (1 of 2) Socket Basics (2 of 2) 3/28/2014

Programming Ethernet with Socket API. Hui Chen, Ph.D. Dept. of Engineering & Computer Science Virginia State University Petersburg, VA 23806

Client-side Networking

Outline. Distributed Computer Systems. Socket Basics An end-point for a IP network connection. Ports. Sockets and the OS. Transport Layer.

Topics for this Week

Types (Protocols) Associated functions Styles We will look at using sockets in C Java sockets are conceptually quite similar

The BSD UNIX Socket Interface (CS 640 Lecture) Assignment 1. Interprocess Communication (IPC) Work Individually (no groups)

Programming Internet with Socket API. Hui Chen, Ph.D. Dept. of Engineering & Computer Science Virginia State University Petersburg, VA 23806

Introduction to Socket Programming

A Socket Example. Haris Andrianakis & Angelos Stavrou George Mason University

NETWORK PROGRAMMING. Instructor: Junaid Tariq, Lecturer, Department of Computer Science

Communication. Sockets (Haviland Ch. 10)

Lecture 7. Followup. Review. Communication Interface. Socket Communication. Client-Server Model. Socket Programming January 28, 2005

ECE 435 Network Engineering Lecture 2

Context. Distributed Systems: Sockets Programming. Alberto Bosio, Associate Professor UM Microelectronic Departement

Programming Ethernet with Socket API. Hui Chen, Ph.D. Dept. of Engineering & Computer Science Virginia State University Petersburg, VA 23806

Project 3. Reliable Data Transfer over UDP. NTU CSIE Computer Networks 2011 Spring

CS321: Computer Networks Socket Programming

EECS122 Communications Networks Socket Programming. Jörn Altmann

Assignment 2 Group 5 Simon Gerber Systems Group Dept. Computer Science ETH Zurich - Switzerland

Network Socket Programming - 3 BUPT/QMUL

SOCKET PROGRAMMING. What is a socket? Using sockets Types (Protocols) Associated functions Styles

Outline. Operating Systems. Socket Basics An end-point for a IP network connection. Ports. Network Communication. Sockets and the OS

Network Socket Programming - 3 BUPT/QMUL

What s an API? Do we need standardization?

UNIX Sockets. COS 461 Precept 1

The TCP Protocol Stack

UNIT IV- SOCKETS Part A

CS 3516: Computer Networks

Session NM056. Programming TCP/IP with Sockets. Geoff Bryant Process software

CSc 450/550 Computer Networks Network Architectures & Client-Server Model

CPS 214: Computer Networks. Slides by Adolfo Rodriguez

CSE/EE 461 Lecture 14. Connections. Last Time. This Time. We began on the Transport layer. Focus How do we send information reliably?

Server-side Programming

Networks. Practical Investigation of TCP/IP Ports and Sockets. Gavin Cameron

EEC-484/584 Computer Networks

Network programming(i) Lenuta Alboaie

CSC209H Lecture 10. Dan Zingaro. March 18, 2015

ICT 6544 Distributed Systems Lecture 5

Elementary TCP Sockets

Introduction to Lab 2 and Socket Programming. -Vengatanathan Krishnamoorthi

Transcription:

CMPSC 311- Introduction to Systems Programming Module: Network Programming Professor Patrick McDaniel Fall 2016

What is a network? A network is a collection of computing devices that share a transmission media Traditional wired networks (ethernet) High-speed backbone (fibre) Wireless (radio) Microwave Infrared The way the network is organized is called the network topology Page 2

The Internet The Internet is an interconnected collection of many networks. Page 3

A Closer Look at Network Structure network edge: hosts: clients and servers servers often in data centers access networks, physical media: wired, wireless communication links network core: interconnected routers network of networks Page 4

OSI Layer Model application application Application protocols presentation session transport presentation session transport the format and meaning of messages between application entities network data link physical network data link physical network data link physical e.g., HTTP is an application level protocol that dictates how web browsers and web servers communicate HTTP is implemented on top of TCP streams Page 5

Internet protocol stack application: supporting network applications FTP, SMTP, HTTP transport: process-process data transfer TCP, UDP network: routing of datagrams from source to destination application transport network link physical IP, routing protocols link: data transfer between neighboring network elements PPP, Ethernet physical: bits on the wire Page 6

Encapsulation message M application segment H t M transport datagram H n H t M network frame H l H n H t M link physical source link physical switch H t M M destination application transport H l H n H n H t H t M M network link physical H n H t M H n H t M network H l H n H t M link physical router Page 7

The E2E Argument Idea: most systems require end-to-end communication service, but low-level features have costs (performance) incurred by all users... thus... It is important that the features provided at a low level remain very simple... yielding... Smart endpoints... dumb minimal network Consequence: the network is simple and not very receptive to new (often complicated) services being added into them. Thus, systems must implement their own functions over the largely dumb (but fast and reliable) network Page 8

Network vs. Web The network is a service... A conduit for data to be passed between systems. Layers services (generally) to allow flexibility. Highly scalable. This is a public channel. The Web is an application This is an application for viewing/manipulating content. The services are unbounded by services, e.g., Java. This can either be public (as in CNN s website), or private (as in enterprise internal HR websites). Page 9

Networks Systems Conceptually, think about network programming as two or more programs on the same or different computers talking to each other The send messages back and forth The flow of messages and the meaning of the message content is called the network protocol or just protocol P1 P2 Page 10

What s a Protocol? Example: A human protocol and a computer protocol: Page 11

Example: DNS DNS (domain name system) maps between IP address (12.1.1.3) and domain and host names (ada.cse.psu.edu) How it works: the root servers redirect you to the top level domains (TLD) DNS servers, which redirect you to the appropriate sub-domain, and recursively. Note: there are 13 root servers that contain the TLDs for.org,.edu, and country specific registries (.fr,.ch) Page 12

A DNS query DNS Cache www.patrickmcdaniel.org = 207.140.168.131 Page 13

Socket Programming Almost all meaningful careers in programming involve at least some level of network programming. Most of them involve sockets programming Berkeley sockets originated in 4.2 BSD Unix circa 1983 it is the standard API for network programming available on most OSs POSIX socket API a slight updating of the Berkeley sockets API a few functions were deprecated or replaced better support for multi-threading was added Page 14

Recall file descriptors Remember open, read, write, and close? POSIX system calls interacting with files recall open() returns a file descriptor an integer that represents an open file inside the OS, it s an index into a table that keeps track of any state associated with your interactions, such as the file position you pass the file descriptor into read, write, and close Page 15

Networks and sockets UNIX makes all I/O look like file I/O the good news is that you can use read() and write() to interact with remote computers over a network! just like with files... A program can have multiple network channels open at once you need to pass read() and write() a file descriptor to let the OS know which network channel you want to write to or read from The file descriptor used for network communications is a socket Page 16

Pictorially 128.95.4.33 Web server fd 5 fd 8 fd 9 fd 3 file descriptor type connected to? 0 pipe stdin (console) 1 pipe stdout (console) 2 pipe stderr (console) 80 80 3 TCP socket local: 128.95.4.33:80 remote: 44.1.19.32:7113 index.html pic.png Internet 5 file index.html 8 file pic.png 9 TCP socket local: 128.95.4.33:80 remote: 10.12.3.4:5544 client client 10.12.3.4 : 5544 44.1.19.32 : 7113 OS s descriptor table Page 17

Types of sockets Stream sockets for connection-oriented, point-to-point, reliable bytestreams uses TCP, SCTP, or other stream transports Datagram sockets for connection-less, one-to-many, unreliable packets uses UDP or other packet transports Raw sockets for layer-3 communication (raw IP packet manipulation) Page 18

Stream sockets Typically used for client / server communications but also for other architectures, like peer-to-peer Client an application that establishes a connection to a server Server an application that receives connections from clients client server 1. establish connection client server 2. communicate client server 3. close connection Page 19

Datagram sockets Used less frequently than stream sockets they provide no flow control, ordering, or reliability Often used as a building block streaming media applications sometimes, DNS lookups 1. create socket host host host 1. create socket 1. create socket host host host host 2. communicate host Note: this is also called connectionless communication Page 20

Network communication Every communication/connection is defined by: 1. A transport protocol type (TCP, UDP) 2. An IP address (e.g., 192.168.27.4) 3. A port (80/http) Page 21

Network addresses Every device on the Internet needs to have an address Needs to be unique to make sure that it can be reached unambiguously For IPv4, an IP address is a 4-byte tuple e.g., 128.95.4.1 (80:5f:04:01 in hex) For IPv6, an IP address is a 16-byte tuple e.g., 2d01:0db8:f188:0000:0000:0000:0000:1f33 2d01:0db8:f188::1f33 in shorthand Page 22

Network Ports Every computer has a numbered set of locations that represent the available services can be reached at Ports are numbered 0 to 65535 0 to 1023 are called well known or reserved ports, where you need special privileges to receive on these ports Each transport (UDP/TCP) has its own list of ports Interesting port numbers 20/21 - file transfer protocol (file passing) 22 - secure shell (remote access) 25 - Simple mail transfer protocol (email) 53 - domain name service (internet naming) 80 - HTTP (web) Page 23

Programming a client We ll start by looking at the API from the point of view of a client connecting to a server over TCP there are five steps: 1. figure out the address/port to connect to 2. create a socket 3. connect the socket to the remote server 4. read() and write() data using the socket 5. close the socket Page 24

inet_aton() The inet_aton() converts a IPv4 address into the UNIX structure used for processing: int inet_aton(const char *addr, struct in_addr *inp); Where, addr is a string containing the address to use inp is a pointer to the structure containing the UNIX internal representation of an address used in later system calls inet_aton() returns 0 if failure! Page 25

Putting it to use... #include <stdlib.h> #include <arpa/inet.h> int main(int argc, char **argv) { struct sockaddr_in v4, sa; // IPv4 struct sockaddr_in6 sa6; // IPv6 // IPv4 string to sockaddr_in. (both ways) inet_aton("192.0.1.1", &(v4.sin_addr)); inet_pton(af_inet, "192.0.2.1", &(sa.sin_addr)); // IPv6 string to sockaddr_in6. inet_pton(af_inet6, "2001:db8:63b3:1::3490", &(sa6.sin6_addr)); } return( 0 ); Page 26

Getting back to strings? The inet_ntoa() converts a UNIX structure for an IPv4 address into a ASCII string: char *inet_ntoa(struct in_addr in); struct sockaddr_in caddr, sa; // IPv4 struct sockaddr_in6 sa6; // IPv6 char astring[inet6_addrstrlen]; // IPv6 // Start by converting inet_aton( "192.168.8.9", &caddr.sin_addr); inet_pton(af_inet, "192.0.2.1", &(sa.sin_addr)); inet_pton(af_inet6, "2001:db8:63b3:1::3490", &(sa6.sin6_addr)); // Return to ASCII strings inet_ntop(af_inet6, &(sa6.sin6_addr), astring, INET6_ADDRSTRLEN); printf( "IPv4 : %s\n", inet_ntoa(caddr.sin_addr) ); printf( "IPv6 : %s\n", astring ); Page 27

Domain Name Service (DNS) $ People dig lion.cse.psu.edu tend to use DNS names, not IP addresses the sockets API lets you convert between the two ; <<>> DiG 9.9.2-P1 <<>> lion.cse.psu.edu ;; global options: +cmd ;; Got it s answer: a complicated process, though: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53447 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 a given DNS name can have many IP addresses many different DNS names can map to the same IP address ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; MBZ: 0005, udp: 4000 ;; QUESTION SECTION: ;lion.cse.psu.edu. IN A an IP address will map onto at most one DNS names, and maybe none a DNS lookup may require interacting with many DNS servers ;; ANSWER SECTION: lion.cse.psu.edu. 5 IN A 130.203.22.184 ;; Query time: 38 msec ;; SERVER: 127.0.1.1#53(127.0.1.1) ;; WHEN: Tue Nov 12 14:02:11 2013 ;; MSG SIZE rcvd: 61 Note: The dig Linux program is used to check DNS entries. Page 28

The FQDN Every system that is supported by DNS has a unique fully qualified domain name Page 29

DNS hierarchy A! B! C! M!. -- root name servers! 198.41.0.4 (a.root-servers.net) 192.228.79.201 (b.root-servers.net) 202.12.27.33 (m.root-servers.net) com! xxx! uk! edu!.com. -- top-level domain server google! yahoo! hulu! psu! umich! msu! www! mail! docs! finance! cs! www! Page 30

Resolving DNS names The POSIX way is to use getaddrinfo() a pretty complicated system call; the basic idea... set up a hints structure with constraints you want respected e.g., IPv6, IPv4, or either indicate which host and port you want resolved host: a string representation; DNS name or IP address returns a list of results packet in an addrinfo struct free the addrinfo structure using freeaddrinfo() Page 31

DNS resolution (the easy way) The gethostbyname() uses DNS to look up a name and return the host information struct hostent *gethostbyname(const char *name); Where, name is a string containing the host/domain name to find hostent is a structure with the given host name. Here name is either a hostname, or an IPv4 address in standard dot notation. The structure includes: hostent->h_name (fully qualified doman name FDQN) hostent->h_addr_list (list of pointers to IP addresses) Page 32

DNS resolution (the easy way) The gethostbyname() uses DNS to look up a name and return the host information struct hostent *gethostbyname(const char *name); Where, char hn = lion.cse.psu.edu ; struct hostent * hstinfo; name is a string containing the host/domain name to find struct in_addr **addr_list; if ( (hstinfo = gethostbyname(hn)) == NULL ) { hostent return( -1 ); is a structure with the given host name. Here name } is either a hostname, or an IPv4 address in standard dot notation. The structure includes: addr_list = (struct in_addr **)hstinfo->h_addr_list; printf( "DNS lookup [%s] address [%s]\n", hstinfo->h_name, inet_ntoa(*addr_list[0]) ); hostent->h_name (fully qualified doman name FDQN) hostent->h_addr_list (list of pointers to IP addresses) $./network DNS lookup [lion.cse.psu.edu] address [130.203.22.184] $ Page 33

Creating a socket The socket() function creates a file handle for use in network communication: int socket(int domain, int type, int protocol); Where, domain is the communication domain AF_INET (IPv4), AF_INET6 (IPv6) type is the communication semantics (stream vs. datagram) SOCK_STREAM is stream (using TCP by default) SOCK_DGRAM is datagram (using UDP by default) protocol selects a protocol from available (not used often) Note: creating a socket doesn t connect to anything Page 34

Programming a client We ll start by looking at the API from the point of view of a client connecting to a server over TCP there are five steps: 1. figure out the address/port to connect to 2. create a socket 3. connect the socket to the remote server 4. read() and write() data using the socket 5. close the socket Page 35

Creating a socket The socket() function creates a file handle for use in network communication: int socket(int domain, int type, int protocol); Where, domain is the communication domain AF_INET (IPv4), AF_INET6 (IPv6) type is the communication semantics (stream vs. datagram) SOCK_STREAM is stream (using TCP by default) SOCK_DGRAM is datagram (using UDP by default) protocol selects a protocol from available (not used often) Note: creating a socket doesn t connect to anything Page 36

Creating a socket The socket() function creates a file handle for use in network communication: int socket(int domain, int type, int protocol); Where, // Create the socket int sockfd; sockfd domain = socket(pf_inet, is the communication SOCK_STREAM, domain 0); if (sockfd == -1) { printf( AF_INET "Error (IPv4), on socket AF_INET6 creation [%s]\n", (IPv6) strerror(errno) ); return( -1 ); } type is the communication semantics (stream vs. datagram) SOCK_STREAM is stream (using TCP by default) SOCK_DGRAM is datagram (using UDP by default) protocol selects a protocol from available (not used often) Note: creating a socket doesn t connect to anything Page 37

Specifying an address The next step is to create an address to connect to by specifying the address and port in the proper form. protocol family (addr.sin_family) port (addr.sin_port) IP address (addr.sin_addr) // Variables char *ip = 127.0.0.1 ; unsigned short port = 16453; struct sockaddr_in caddr; // Setup the address information caddr.sin_family = AF_INET; caddr.sin_port = htons(port); if ( inet_aton(ip, &caddr.sin_addr) == 0 ) { return( -1 ); } Page 38

Network byte order When sending data over a network you need to convert your integers to be in network byte order, and back to host byte order upon receive: uint64_t htonll64(uint64_t hostlong64); uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint64_t ntohll64(uint64_t hostlong64); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); Where each of these functions receives a NBO or HBO 64/ 32 /16 byte and converts it to the other. Page 39

connect() The connect() system call connects the socket file descriptor to the specified address int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); Where, sockfd is the socket (file handle) obtained previously addr - is the address structure addlen - is the size of the address structure Returns 0 if successfully connected, -1 if not if ( connect(sockfd, (const struct sockaddr *)&caddr, sizeof(caddr)) == -1 ) { return( -1 ); } Page 40

Reading and Writing Primitive reading and writing mechanisms that only process only blocks of opaque data: ssize_t write(int fd, const void *buf, size_t count); ssize_t read(int fd, void *buf, size_t count); Where fd is the file descriptor, buf is an array of bytes to write from or read into, and count is the number of bytes to read or write In both read() and write(), the value returned is the number of bytes read and written. Be sure to always check the result On reads, you are responsible for supplying a buffer that is large enough to put the output into. look out for memory corruption Page 41

close() close() closes the connection and deletes the associated entry in the operating system s internal structures close( sockfd ); socket_fd = -1; Note: set handles to -1 to avoid use after close. Page 42

Programming a server Now we ll look at the API from the point of view of a server who receives connections from clients there are seven steps: 1. figure out the port to bind to 2. create a socket 3. bind the service 4. begin listening for connections 5. receive connection 6. read() and write() data 7. close the socket Page 43

Setting up a server address All you need to do is specify the service port you will use for the connection: struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(16453); saddr.sin_addr.s_addr = htonl(inaddr_any); However, you don t specify an IP address because you are receiving connections at the local host. Instead you use the special any address htonl(inaddr_any) Next: creating the socket is as with the client Page 44

Binding the service The bind()system call associates a socket with the server connection (e.g., taking control of HTTP) int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen Where, sockfd is the socket (file handle) obtained previously addr - is the address structure addlen - is the size of the address structure Returns 0 if successfully connected, -1 if not if ( bind(sock, (const struct sockaddr *)&saddr, sizeof(saddr)) == -1 ) { return( -1 ); } Page 45

Listening for connections The listen()system call tells the OS to start receiving connections on behalf of the process Where, int listen(int sockfd, int backlog); sockfd is the socket (file handle) obtained previously backlog - is the number of connections to queue A program may process connections as fast as it wants, and the OS will hold the client in a waiting state until you are ready Beware of waiting too long (timeout) if ( listen(sock, 5) == -1 ) { return( -1 ); } Page 46

Waiting for data/connections select()waits for data to process: int select(int nfds, fd_set *read_fds, fd_set *write_fds, fd_set *error_fds, struct timeval *timeout); Waits (up to timeout) events of the following types: readable events on (read_fds) writeable events on (write_fds) error events on (error_fds) Note: processing select is complex, see man page... Page 47

Accepting connections The accept()system call receives the connection from the client: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); Where, sockfd is the socket (file handle) obtained previously addr - is the address structure for client (filled in) addlen - is the size of the address structure Returns the new socket handle or -1 if failure Page 48

Accepting connections The accept()system call receives the connection from the client: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); Where, sockfd is the socket (file handle) obtained previously addr - is the address structure for client (filled in) addlen - is the size of the address structure inet_len = sizeof(caddr); if ( (client = accept(server, (struct sockaddr *)&caddr, Returns &inet_len the )) new == -1 socket ) { handle or -1 if failure printf( "Error on client accept [%s]\n", strerror(errno) ); close(server); return( -1 ); } printf( "Server new client connection [%s/%d]", inet_ntoa(caddr.sin_addr), caddr.sin_port ); Page 49

The rest... From the server perspective, receiving and sending on the newly received socket is the same as if it were a client read() and write() for sending and receiving close() for closing the socket Page 50

Putting it all together (client) int client_operation( void ) { int socket_fd; uint32_t value; struct sockaddr_in caddr; char *ip = "127.0.0.1"; caddr.sin_family = AF_INET; caddr.sin_port = htons(16453); if ( inet_aton(ip, &caddr.sin_addr) == 0 ) { return( -1 ); } socket_fd = socket(pf_inet, SOCK_STREAM, 0); if (socket_fd == -1) { printf( "Error on socket creation [%s]\n", strerror(errno) ); return( -1 ); } if ( connect(socket_fd, (const struct sockaddr *)&caddr, sizeof(caddr)) == -1 ) { printf( "Error on socket connect [%s]\n", strerror(errno) ); return( -1 ); } value = htonl( 1 ); if ( write( socket_fd, &value, sizeof(value))!= sizeof(value) ) { printf( "Error writing network data [%s]\n", strerror(errno) ); return( -1 ); } printf( "Sent a value of [%d]\n", ntohl(value) ); if ( read( socket_fd, &value, sizeof(value))!= sizeof(value) ) { printf( "Error reading network data [%s]\n", strerror(errno) ); return( -1 ); } value = ntohl(value); printf( "Receivd a value of [%d]\n", value ); } close(socket_fd); // Close the socket return( 0 ); Page 51

Putting it all together (server) int server_operation( void ) { int server, client; uint32_t value, inet_len; struct sockaddr_in saddr, caddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(16453); saddr.sin_addr.s_addr = htonl(inaddr_any); server = socket(pf_inet, SOCK_STREAM, 0); if (server == -1) { printf( "Error on socket creation [%s]\n", strerror(errno) ); return( -1 ); } if ( bind(server, (struct sockaddr *)&saddr, sizeof(saddr)) == -1 ) { printf( "Error on socket bind [%s]\n", strerror(errno) ); return( -1 ); } if ( listen( server, 5 ) == -1 ) { printf( "Error on socket listen [%s]\n", strerror(errno) ); return( -1 ); } Page 52

... Together (server, part 2) while ( 1 ) { inet_len = sizeof(caddr); if ( (client = accept( server, (struct sockaddr *)&caddr, &inet_len )) == -1 ) { printf( "Error on client accept [%s]\n", strerror(errno) ); close(server); return( -1 ); } printf( "Server new client connection [%s/%d]", inet_ntoa(caddr.sin_addr), caddr.sin_port ); if ( read( client, &value, sizeof(value))!= sizeof(value) ) { printf( "Error writing network data [%s]\n", strerror(errno) ); close(server); return( -1 ); } value = ntohl(value); printf( "Receivd a value of [%d]\n", value ); value++; value = htonl(value); if ( write( client, &value, sizeof(value))!= sizeof(value) ) { printf( "Error writing network data [%s]\n", strerror(errno) ); close(server); return( -1 ); } printf( "Sent a value of [%d]\n", value ); } close(client); // Close the socket } return( 0 ); Page 53

Course notes I know several folks are going back to the TAs looking for re-grades on the projects. **ALL** such requests must go through me moving forward. The last question of exam #2 had an typo. If you think your test was incorrectly graded (you had the correct answer given the typo), you can give me your exam and I will regrade it. YOU MUST GIVE IT TO ME BY THE END OF CLASS ON MONDAY FOR ME TO CONSIDER IT (some folks have already given it to me). Final policy - you do not have to take the exam if you got a **raw score** (before adjustments) of 70 on the first exam and 80 on the second exam. I will contact you if you are eligible. (I think I misspoke to some and said 70/70 in office hours) Assignment #4 is due next Friday at midnight. All of the previous assignment functions must work perfectly (including the cache, multiple files, and validation). Send early, send to yourself. ANY assignment received after midnight will not be considered. NO EXCEPTIONS. Page

How do do assignment #4 Look at the final slides from the networking lecture. Create the client_cart_bus_request: Page