Introduction to Unix Network Programming

Slides:



Advertisements
Similar presentations
Socket Programming 101 Vivek Ramachandran.
Advertisements

Introduction to Sockets Jan Why do we need sockets? Provides an abstraction for interprocess communication.
Sockets: Network IPC Internet Socket UNIX Domain Socket.
Programming with UDP – I Covered Subjects: IPv4 Socket Address Structure Byte Ordering Functions Address Access/Conversion Functions Functions: 1.socket()
Socket Programming in C Slides Adapted on Jörn Altmann‘s Slides.
Introduction to Information Security Networking. Transmission Control Protocol (aka TCP) Most widely used protocol A TCP Connection is based on 6 crucial.
Elementary TCP Sockets Computer Networks Computer Networks Term B10 UNIX Network Programming Vol. 1, Second Ed. Stevens Chapter 4.
Networks: TCP/IP Socket Calls1 Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Quick Overview. 2 ISO/OSI Reference Model Application Application Presentation Presentation Session Session Transport Transport Network Network Data Link.
Socket Programming: a Primer Socket to me!. Feb. 23, 2001EE122, UCB2 Why does one need sockets? application network protocol sockets network.
Tutorial 8 Socket Programming
Programming with Berkeley Sockets Presented by Chris GauthierDickey Written by Daniel Stutzbach (I think!) for CIS 432/532 Useful References: ● man pages.
EECC694 - Shaaban #1 lec #14 Spring The Application Layer Client/Server Computing, Basic Approaches: –Passing Messages. Example: Communication.
1 Tutorial on Socket Programming Computer Networks - CSC 458 Department of Computer Science Yukun Zhu (Slides are mainly from Monia Ghobadi, and Amin Tootoonchian,
UNIX Sockets COS 461 Precept 1.
Introduction to Information Security Networking. Transmission Control Protocol (aka TCP) Most widely used protocol A ‘reliable’ (but not secure!) protocol.
Network Programming Sockets and Winsock. Please Be Responsible We all know that the Internet is full of security holes –most of them do not require any.
Basic Socket Programming TCP/IP overview. TCP interface Reference: –UNIX Network Programming, by Richard Stevens. –UNIX man page.
TCP Socket Programming. r An abstract interface provided to the application programmer  File descriptor, allows apps to read/write to the network r Allows.
ECE 4110 – Internetwork Programming Client-Server Model.
Sockets and intro to IO multiplexing. Goals We are going to study sockets programming as means to introduce IO multiplexing problem. We will revisit socket.
TCP/IP Protocol Stack IP Device Drivers TCPUDP Application Sockets (Gate to network) TCP: –Establish connection –Maintain connection during the communication.
Network Programming Tutorial #9 CPSC 261. A socket is one end of a virtual communication channel Provides network connectivity to any other socket anywhere.
Socket Programming. Introduction Sockets are a protocol independent method of creating a connection between processes. Sockets can be either – Connection.
Zhu Reference: Daniel Spangenberger Computer Networks, Fall 2007 PPT-4 Socket Programming.
Copyright © University of Illinois CS 241 Staff1 Network Programming.
Computer Network Sritrusta Sukaridhoto. Computer Network – Sritrusta Sukaridhoto Why Computer Network ??? Stand alone Computer …. FOR WHAT ???
2: Application Layer 1 Chapter 2: Application layer r 2.1 Principles of network applications r 2.2 Web and HTTP r Internet gaming r 2.3 FTP r 2.4 Electronic.
Sirak Kaewjamnong Computer Network Systems
Server Sockets: A server socket listens on a given port Many different clients may be connecting to that port Ideally, you would like a separate file descriptor.
 Wind River Systems, Inc Chapter - 13 Network Programming.
Computer Network Sritrusta Sukaridhoto. Why Computer Network ??? Stand alone Computer …. FOR WHAT ???
Network Programming with Sockets Reading: Stevens 3rd ed., Ch. 3-6, or 2 nd ed. Beej's Guide to Network Programming 1.
1 Computer Networks An Introduction to Computer Networks University of Tehran Dept. of EE and Computer Engineering By: Dr. Nasser Yazdani Lecture 3: Sockets.
UNIX Sockets COS 461 Precept 1. Socket and Process Communication The interface that the OS provides to its networking subsystem application layer transport.
Introduction to Socket
Socket Programming Lab 1 1CS Computer Networks.
2: Application Layer1 Chapter 2: Application layer r 2.1 Principles of network applications r 2.2 Web and HTTP r 2.3 FTP r 2.4 Electronic Mail  SMTP,
1 CS716 Advanced Computer Networks By A. Wahid Shaikh.
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: HsinYu Ha.
Introduction to Sockets
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha.
2: Application Layer 1 Socket Programming UNIX Network Programming, Socket Programming Tutorial:
CSCI 330 UNIX and Network Programming Unit XIV: User Datagram Protocol.
Socket Programming. Computer Science, FSU2 Interprocess Communication Within a single system – Pipes, FIFOs – Message Queues – Semaphores, Shared Memory.
1 Spring Semester 2008, Dept. of Computer Science, Technion Internet Networking recitation #7 Socket Programming.
Lecture 3 TCP and UDP Sockets CPE 401 / 601 Computer Network Systems slides are modified from Dave Hollinger.
1 Socket Interface. 2 Client-Server Architecture The client is the one who speaks first Typical client-server situations  Client and server on the same.
Socket Programming(1/2). Outline  1. Introduction to Network Programming  2. Network Architecture – Client/Server Model  3. TCP Socket Programming.
1 Socket Interface. 2 Basic Sockets API Review Socket Library TCPUDP IP EthernetPPP ARP DHCP, Mail, WWW, TELNET, FTP... Network cardCom Layer 4 / Transport.
SOCKET PROGRAMMING Presented By : Divya Sharma.
UNIX Sockets COS 461 Precept 1.
Advanced Computer Networks
CS 1652 Jack Lange University of Pittsburgh
Introduction to Information Security
Socket Programming in C
Imam Ahmad Trinugroho, ST., MMSI
Transport layer API: Socket Programming
Socket Programming in C
Advanced Network Programming spring 2007
Chapter 2: Application layer
TCP/IP Socket Programming in C
Chapter 2 Application Layer
Socket Programming(1/2)
Sockets Programming Socket to me!.
Sockets Programming Socket to me!.
Internet Networking recitation #8
Outline Communications in Distributed Systems Socket Programming
Chapter 2: Application layer
Presentation transcript:

Introduction to Unix Network Programming Reference: Stevens Unix Network Programming

How do we Communicate? Send a mail from Alice to Bob Example: Hollywood, California Send a mail from Alice to Bob Alice in Champaign, Bob in Hollywood Example: US Postal Service Bob Champaign, Illinois Alice 8/30/06 UIUC - CS/ECE 438, Fall 2006

What does Alice do? Alice 200 Cornfield Rd. Champaign, IL 61820 Bob 100 Santa Monica Blvd. Hollywood, CA 90028 Bob’s address (to a mailbox) Bob’s name – in case people share mailbox Postage – have to pay! Alice’s own name and address – in case Bob wants to return a message 8/30/06 UIUC - CS/ECE 438, Fall 2006

What does Bob do? Install a mailbox Receive the mail Alice 200 Cornfield Rd. Champaign, IL 61820 Bob 100 Santa Monica Blvd. Hollywood, CA 90028 Install a mailbox Receive the mail Get rid of envelope Read the message 8/30/06 UIUC - CS/ECE 438, Fall 2006

What about sending a TCP/IP packet? Very similar to Alice-mailing-to-Bob Different terminologies – very confusing We have to remember Different technologies Suppose to be better (faster, more reliable, cheaper, …) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Two simplest networking programs Alice the sending process Alice’s address: 128.174.246.177 (IP addr) Alice’s name: 12345 (port #) Bob the receiving process Bob’s address: 216.52.167.132 (IP addr) Bob’s name: 23456 (port #) int main () { int sockfd; struct sockaddr_in bob_addr, alice_addr; bzero(&bob_addr, sizeof(bob_addr)); bob_addr.sin_family = AF_INET; bob_addr.sin_addr.s_addr = 0xD834A784; bob_addr.sin_port = 23456; // do the same for alice_addr … sockfd = socket(AF_INET, SOCK_DGRAM, 0); sendto(sockfd, “hi”, strlen(“hi”), 0, &bob_addr, sizeof(bob_addr)); } int main () { int sockfd, n; struct sockaddr_in bob_addr, alice_addr; char mesg[100]; bzero(&bob_addr, sizeof(bob_addr)); bob_addr.sin_family = AF_INET; bob_addr.sin_addr.s_addr = 0xD834A784; bob_addr.sin_port = 23456; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bind(sockfd, &bob_addr, sizeof(bob_addr)); n= recvfrom(sockfd, mesg, 100, 0, &alice_addr, sizeof(alice_addr)); } 8/30/06 UIUC - CS/ECE 438, Fall 2006

What are the problems? Message may be lost Network is congested Receiver is congested Message may be duplicated, corrupted Multiple messages: re-ordered Concurrent connections … 8/30/06 UIUC - CS/ECE 438, Fall 2006

Direction and Principles Programming learn to use Internet for communication (with focus on implementation of networking concepts) Physical Transport Data Link Network Principles and Concepts learn to build network from ground up 8/30/06 UIUC - CS/ECE 438, Fall 2006

Sockets process sends/receives messages to/from its socket socket analogous to mailbox sending process relies on transport infrastructure which brings message to socket at receiving process process TCP with buffers, variables socket host or server process TCP with buffers, variables socket host or server controlled by app developer Internet 8/30/06 UIUC - CS/ECE 438, Fall 2006

Network Programming with Sockets Reading: Stevens 2nd ed., Ch. 1-6 or 1st ed., Ch. 1-3, 6 Sockets API: A transport layer service interface Introduced in 1981 by BSD 4.1 Implemented as library and/or system calls Similar interfaces to TCP and UDP Can also serve as interface to IP (for super-user); known as “raw sockets” 8/30/06 UIUC - CS/ECE 438, Fall 2006

Outline Client-Sever Model TCP/UDP Overview Addresses and Data Sockets API Example 8/30/06 UIUC - CS/ECE 438, Fall 2006

Client-Server Model Asymmetric Communication Server/Daemon Client Client sends requests Server sends replies Server/Daemon Well-known name (e.g., IP address + port) Waits for contact Processes requests, sends replies Client Initiates contact Waits for response Client Client Server Client Client 8/30/06 UIUC - CS/ECE 438, Fall 2006

Socket Communication Client process Server process Listening socket 3-way handshaking Listening socket Client socket Connection socket 8/30/06 UIUC - CS/ECE 438, Fall 2006

Client-Server Communication Model Service Model Concurrent: Server processes multiple clients’ requests simultaneously Sequential: Server processes only one client’s requests at a time Hybrid: Server maintains multiple connections, but processes responses sequentially Client and server categories are not disjoint A server can be a client of another server A server can be a client of its own client 8/30/06 UIUC - CS/ECE 438, Fall 2006

TCP Connections Transmission Control Protocol (TCP) Service OSI Transport Layer Service Model Reliable byte stream (interpreted by application) 16-bit port space allows multiple connections on a single host Connection-oriented Set up connection before communicating Tear down connection when done 8/30/06 UIUC - CS/ECE 438, Fall 2006

TCP Service Reliable Data Transfer Sequenced Data Transfer Guarantees delivery of all data Exactly once if no catastrophic failures Sequenced Data Transfer Guarantees in-order delivery of data If A sends M1 followed by M2 to B, B never receives M2 before M1 Regulated Data Flow Monitors network and adjusts transmission appropriately Prevents senders from wasting bandwidth Reduces global congestion problems Data Transmission Full-Duplex byte stream 8/30/06 UIUC - CS/ECE 438, Fall 2006

UDP Services User Datagram Protocol Service OSI Transport Layer Provides a thin layer over IP 16-bit port space (distinct from TCP ports) allows multiple recipients on a single host 8/30/06 UIUC - CS/ECE 438, Fall 2006

UDP Services Unit of Transfer Unreliable Unordered Datagram (variable length packet) Unreliable No guaranteed delivery Drops packets silently Unordered No guarantee of maintained order of delivery Unlimited Transmission No flow control 8/30/06 UIUC - CS/ECE 438, Fall 2006

Addresses and Data Internet domain names IP addresses Human readable Variable length Ex: sal.cs.uiuc.edu IP addresses Easily handled by routers/computers Fixed length Somewhat geographical Ex: 128.174.252.217 8/30/06 UIUC - CS/ECE 438, Fall 2006

Byte Ordering Big Endian vs. Little Endian Little Endian (Intel, DEC): Least significant byte of word is stored in the lowest memory address Big Endian (Sun, SGI, HP): Most significant byte of word is stored in the lowest memory address Network Byte Order = Big Endian Allows both sides to communicate Must be used for some data (i.e. IP Addresses) Good form for all binary data 8/30/06 UIUC - CS/ECE 438, Fall 2006

Byte Ordering Functions 16- and 32-bit conversion functions (for platform independence) Examples: int m, n; short int s,t; m = ntohl (n) net-to-host long (32-bit) translation s = ntohs (t) net-to-host short (16-bit) translation n = htonl (m) host-to-net long (32-bit) translation t = htons (s) host-to-net short (16-bit) translation 8/30/06 UIUC - CS/ECE 438, Fall 2006

Socket Address Structure IP address: struct in_addr { in_addr_t s_addr; /* 32-bit IP address */ }; TCP or UDP address: struct sockaddr_in { short sin_family; /* e.g., AF_INET */ ushort sin_port; /* TCP/UDP port */ struct in_addr; /* IP address */ all but sin_family in network byte order 8/30/06 UIUC - CS/ECE 438, Fall 2006

Address Access/Conversion Functions All binary values are network byte ordered struct hostent* gethostbyname (const char* hostname); Translate English host name to IP address (uses DNS) struct hostent* gethostbyaddr (const char* addr, size_t len, int family); Translate IP address to English host name (not secure) char* inet_ntoa (struct in_addr inaddr); Translate IP address to ASCII dotted-decimal notation (e.g., “128.32.36.37”) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Structure: hostent The hostent data structure (from /usr/include/netdb.h) canonical domain name and aliases list of addresses associated with machine also address type and length information struct hostent { char* h_name; /* official name of host */ char** h_aliases; /* NULL-terminated alias list */ int h_addrtype /* address type (AF_INET) */ int h_length; /* length of addresses (4B) */ char** h_addr_list; /* NULL-terminated address list */ #define h_addr h_addr_list[0];/* backward-compatibility */ }; 8/30/06 UIUC - CS/ECE 438, Fall 2006

Address Access/Conversion Functions in_addr_t inet_addr (const char* strptr); Translate dotted-decimal notation to IP address; returns -1 on failure, thus cannot handle broadcast value “255.255.255.255” int inet_aton (const char *strptr, struct in_addr *inaddr); Translate dotted-decimal notation to IP address; returns 1 on success, 0 on failure int gethostname (char* name, size_t namelen); Read host’s name (use with gethostbyname to find local IP) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Sockets API Basic Unix Concepts Creation and Setup Establishing a Connection (TCP) Sending and Receiving Data Tearing Down a Connection (TCP) Advanced Sockets 8/30/06 UIUC - CS/ECE 438, Fall 2006

UDP Connection Example client server socket socket bind sendto recvfrom sendto recvfrom close 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: sendto int sendto (int sockfd, char* buf, size_t nbytes, int flags, struct sockaddr* destaddr, int addrlen); Send a datagram to another UDP socket. Returns number of bytes written or -1. Also sets errno on failure. sockfd: socket file descriptor (returned from socket) buf: data buffer nbytes: number of bytes to try to read flags: see man page for details; typically use 0 destaddr: IP address and port number of destination socket addrlen: length of address structure = sizeof (struct sockaddr_in) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: recvfrom int recvfrom (int sockfd, char* buf, size_t nbytes, int flags, struct sockaddr* srcaddr, int* addrlen); Read a datagram from a UDP socket. Returns number of bytes read (0 is valid) or -1. Also sets errno on failure. sockfd: socket file descriptor (returned from socket) buf: data buffer nbytes: number of bytes to try to read flags: see man page for details; typically use 0 srcaddr: IP address and port number of sending socket (returned from call) addrlen: length of address structure = pointer to int set to sizeof (struct sockaddr_in) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Socket Functions TCP Server TCP Client socket() bind() Well-known port listen() accept() socket() blocks until connection from client connect() read() TCP three-way handshaking write() data (request) process request 8/30/06 UIUC - CS/ECE 438, Fall 2006

Socket Functions TCP Server TCP Client socket() blocks until connection from client TCP Server connect() TCP Client read() TCP three-way handshaking write() data (request) process request write() data (reply) read() read() close() close() 8/30/06 UIUC - CS/ECE 438, Fall 2006

TCP Connection Example client server socket bind socket listen connect accept write read write read close read close 8/30/06 UIUC - CS/ECE 438, Fall 2006

Socket Creation and Setup Include file <sys/socket.h> Create a socket int socket (int family, int type, int protocol); Returns file descriptor or -1. Bind a socket to a local IP address and port number int bind (int sockfd, struct sockaddr* myaddr, int addrlen); Put socket into passive state (wait for connections rather than initiate a connection). int listen (int sockfd, int backlog); Accept connections int accept (int sockfd, struct sockaddr* cliaddr, int* addrlen); 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: socket int socket (int family, int type, int protocol); Create a socket. Returns file descriptor or -1. Also sets errno on failure. family: address family (namespace) AF_INET for IPv4 other possibilities: AF_INET6 (IPv6), AF_UNIX or AF_LOCAL (Unix socket), AF_ROUTE (routing) type: style of communication SOCK_STREAM for TCP (with AF_INET) SOCK_DGRAM for UDP (with AF_INET) protocol: protocol within family typically 0 8/30/06 UIUC - CS/ECE 438, Fall 2006

Function: bind int bind (int sockfd, struct sockaddr* myaddr, int addrlen); Bind a socket to a local IP address and port number. Returns 0 on success, -1 and sets errno on failure. sockfd: socket file descriptor (returned from socket) myaddr: includes IP address and port number IP address: set by kernel if value passed is INADDR_ANY, else set by caller port number: set by kernel if value passed is 0, else set by caller addrlen: length of address structure = sizeof (struct sockaddr_in) 8/30/06 UIUC - CS/ECE 438, Fall 2006

TCP and UDP Ports Allocated and assigned by the Internet Assigned Numbers Authority see RFC 1700 or ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers 1-512 standard services (see /etc/services) super-user only 513-1023 registered and controlled, also used for identity verification 1024-49151 registered services/ephemeral ports 49152-65535 private/ephemeral ports 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: listen int listen (int sockfd, int backlog); Put socket into passive state (wait for connections rather than initiate a connection). Returns 0 on success, -1 and sets errno on failure. sockfd: socket file descriptor (returned from socket) backlog: bound on length of unaccepted connection queue (connection backlog); kernel will cap, thus better to set high 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: accept int accept (int sockfd, struct sockaddr* cliaddr, int* addrlen); Accept a new connection. Returns file descriptor or -1. Also sets errno on failure. sockfd: socket file descriptor (returned from socket) cliaddr: IP address and port number of client (returned from call) addrlen: length of address structure = pointer to int set to sizeof (struct sockaddr_in) addrlen is a value-result argument: the caller passes the size of the address structure, the kernel returns the size of the client’s address (the number of bytes written) 8/30/06 UIUC - CS/ECE 438, Fall 2006

server #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define PORT 3490 /* well-known port */ #define BACKLOG 10 /* how many pending connections queue will hold */ 8/30/06 UIUC - CS/ECE 438, Fall 2006

server main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address */ struct sockaddr_in their_addr; /* connector addr */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1){ perror("socket"); exit(1); } 8/30/06 UIUC - CS/ECE 438, Fall 2006

server bzero(&my_addr, sizeof(struct sockaddr)); /* zero the struct */ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } 8/30/06 UIUC - CS/ECE 438, Fall 2006

server if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr*) &their_addr,&sin_size)) == -1) { perror("accept"); continue; printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr)); 8/30/06 UIUC - CS/ECE 438, Fall 2006

Establishing a Connection Include file <sys/socket.h> int connect (int sockfd, struct sockaddr* servaddr, int addrlen); Connect to another socket. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: connect int connect (int sockfd, struct sockaddr* servaddr, int addrlen); Connect to another socket. Returns 0 on success, -1 and sets errno on failure. sockfd: socket file descriptor (returned from socket) servaddr: IP address and port number of server addrlen: length of address structure = sizeof (struct sockaddr_in) 8/30/06 UIUC - CS/ECE 438, Fall 2006

client if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror (“socket”); exit (1); } their_addr.sin_family = AF_INET; /* interp’d by host */ their_addr.sin_port = htons (PORT); their_addr.sin_addr = *((struct in_addr*)he->h_addr); bzero (&(their_addr.sin_zero), 8); /* zero rest of struct */ if (connect (sockfd, (struct sockaddr*)&their_addr, sizeof (struct sockaddr)) == -1) { perror (“connect”); 8/30/06 UIUC - CS/ECE 438, Fall 2006

Sending and Receiving Data int write (int sockfd, char* buf, size_t nbytes); Write data to a stream (TCP) or “connected” datagram (UDP) socket. Returns number of bytes written or -1. int read (int sockfd, char* buf, size_t nbytes); Read data from a stream (TCP) or “connected” datagram (UDP) socket. Returns number of bytes read or -1. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Sending and Receiving Data int sendto (int sockfd, char* buf, size_t nbytes, int flags, struct sockaddr* destaddr, int addrlen); Send a datagram to another UDP socket. Returns number of bytes written or -1. int recvfrom (int sockfd, char* buf, size_t nbytes, int flags, struct sockaddr* srcaddr, int* addrlen); Read a datagram from a UDP socket. Returns number of bytes read or -1. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: write int write (int sockfd, char* buf, size_t nbytes); Write data to a stream (TCP) or “connected” datagram (UDP) socket. Returns number of bytes written or -1. Also sets errno on failure. sockfd: socket file descriptor (returned from socket) buf: data buffer nbytes: number of bytes to try to write Some reasons for failure or partial writes: process received interrupt or signal kernel resources unavailable (e.g., buffers) 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: read int read (int sockfd, char* buf, size_t nbytes); Read data from a stream (TCP) or “connected” datagram (UDP) socket. Returns number of bytes read or -1. Also sets errno on failure. Returns 0 if socket closed. sockfd: socket file descriptor (returned from socket) buf: data buffer nbytes: number of bytes to try to read 8/30/06 UIUC - CS/ECE 438, Fall 2006

Tearing Down a Connection int close (int sockfd); Close a socket. Returns 0 on success, -1 and sets errno on failure. int shutdown (int sockfd, int howto); Force termination of communication across a socket in one or both directions. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: close int close (int sockfd); Close a socket. Returns 0 on success, -1 and sets errno on failure. sockfd: socket file descriptor (returned from socket) Closes communication on socket in both directions. All data sent before close are delivered to other side (although this aspect can be overridden). After close, sockfd is not valid for reading or writing. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Functions: shutdown int shutdown (int sockfd, int howto); Force termination of communication across a socket in one or both directions. Returns 0 on success, -1 and sets errno on failure. sockfd: socket file descriptor (returned from socket) howto: SHUT_RD to stop reading SHUT_WR to stop writing SHUT_RDWR to stop both shutdown overrides the usual rules regarding duplicated sockets, in which TCP teardown does not occur until all copies have closed the socket. 8/30/06 UIUC - CS/ECE 438, Fall 2006

Advanced Sockets Managing Multiple Connections Detecting Data Arrival fork/exec: multiple server processes pthread_create: multi-threaded server process (no calls): event-based server process Detecting Data Arrival select and poll functions Synchronous vs. Asynchronous Connections Other Socket Options 8/30/06 UIUC - CS/ECE 438, Fall 2006

Examples Taken from Beej’s Guide to Network Programming: http://beej.us/guide/bgnet/ Client-Server example using TCP For each client server forks new process to handle connection sends “Hello, world” 8/30/06 UIUC - CS/ECE 438, Fall 2006

server #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define PORT 3490 /* well-known port */ #define BACKLOG 10 /* how many pending connections queue will hold */ 8/30/06 UIUC - CS/ECE 438, Fall 2006

server main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address */ struct sockaddr_in their_addr; /* connector addr */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1){ perror("socket"); exit(1); } 8/30/06 UIUC - CS/ECE 438, Fall 2006

server my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* automatically fill with my IP (w/o Beej’s bug) */ bzero(&(my_addr.sin_zero), 8); /* zero the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } 8/30/06 UIUC - CS/ECE 438, Fall 2006

server if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr*) &their_addr,&sin_size)) == -1) { perror("accept"); continue; printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr)); 8/30/06 UIUC - CS/ECE 438, Fall 2006

server if (!fork()) { /* this is the child process */ if (send(new_fd,"Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ /* clean up all child processes */ while(waitpid(-1,NULL,WNOHANG) > 0); 8/30/06 UIUC - CS/ECE 438, Fall 2006

client #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3490 /* well-known port */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ 8/30/06 UIUC - CS/ECE 438, Fall 2006

client int main (int argc, char* argv[]){ int sockfd, numbytes; char buf[MAXDATASIZE + 1]; struct hostent* he; struct sockaddr_in their_addr; /* connector’s address information */ if (argc != 2) { fprintf (stderr, “usage: client hostname\n”); exit (1); } if ((he = gethostbyname (argv[1])) == NULL) { /* get the host info */ perror (“gethostbyname”); 8/30/06 UIUC - CS/ECE 438, Fall 2006

client if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror (“socket”); exit (1); } their_addr.sin_family = AF_INET; /* interp’d by host */ their_addr.sin_port = htons (PORT); their_addr.sin_addr = *((struct in_addr*)he->h_addr); bzero (&(their_addr.sin_zero), 8); /* zero rest of struct */ if (connect (sockfd, (struct sockaddr*)&their_addr, sizeof (struct sockaddr)) == -1) { perror (“connect”); 8/30/06 UIUC - CS/ECE 438, Fall 2006

client if ((numbytes = recv (sockfd, buf, MAXDATASIZE, 0)) == -1) { perror (“recv”); exit (1); } buf[numbytes] = ‘\0’; printf (“Received: %s”, buf); close (sockfd); return 0; 8/30/06 UIUC - CS/ECE 438, Fall 2006