• Review: • How to create a TCP end point? • What is the right format for sin_port and sin_addr in the sockaddr_in data structure? • How many different ways we can bind a socket? • How to specify the maximum number of connections for a socket? • How to find out the remote machine information? • Today’s topic: • Introduction to UDP • Some server design alternatives • Select • TCP: Reliable byte stream service. – Different ways to build client/servers –How to get around blocking I/O –Assumption: whatever sent will eventually be received!! • UDP: Unreliable datagram service. • Data may get lost – application may need to deal with more details in the communication. • Why UDP: – Applications that do not need 100% reliability communication. E.g VoIP, video stream, DNS servers. – Applications care a lot about performance: high performance computing (TCP cares too much about fairness). – Applications that need multicast or broadcast (TCP only supports point to point communication). • Basic UDP service interface: – Socket, bind, sendto, recvfrom, close UDP server TCP client server socket socket socket Bind bind sendto Listen recvfrom recvfrom … Sendto close close client socket connect … close #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); ssize_t sendto(int sockfd, void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen); See udpsender.c/udprecv.c for communication using UDP. Server design alternatives: concurrent and multiplexed server. • Concurrent server (see lect3/example5.c): • Use a new child process to handle a new connection requests. • Multiplexed Server: The use of select. • I/O multiplexing – check the file descriptor before performing a blocking operation (what happen to the client when a concurrent server clushs?). – The select function that allows: • To detect any of the descriptors in the read set are ready for reading. • To detect any of the descriptors in the write set are ready for writing • To detect any of the descriptors in the error set have exception conditions pending. • To wait for a period for something to happen. #include <sys/select.h> #include <sys/time.h> int select (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout) – Set the timeout value: Struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ } • Wait forever (blocking select): timeout = NULL • Non blocking select (return right away: tv_sec = 0; tv_usec = 0; • Wait for a certain amount of time: tv_sec and tv_usec –Set the set of file descriptors value: void FD_ZERO(fd_set *fdset) void FD_SET(int fd, fd_set *fdset) void FD_CLR(int fd, fd_set *fdset) void FD_ISSET(int fd, fd_set *fdset) –Maxfdp1: the maximum file descriptor number plus 1. (can just specify a big number (64) if unknown). –Select clears the uninteresting file descriptors in the fd_sets – always reset the fd_sets before calling select. • When is a socket ready for read? • The number of bytes in the socket is more than the low-water mark (can be set, default 1 for TCP/UDP socket) • Half of the connection is closed • Listening socket with nonzero of completed connections • Socket error. • When is a socket ready for write? • The available buffer space is larger than the low-water mark • Half the connection is closed • Error pending • Exception? • Out of band data exists. • A multiplexed server (multiserv.c) –A single process to handle everything including connection request and data processing. –Using select the check on all descriptors that might need communication. • Response to whatever from the clients.