15 213 Recitation 10 Greg Reshko Office Hours Wed 2 00 3 00PM April 28th 2003 Outline Sockets Interface Echo Client Server FCEs Internet connection Clients and s ervers c omm unic ate by sending s treams of bytes over c onnec ti ons point to poi nt full dupl ex and rel iabl e A s oc k et is an endpoi nt of a c onnec ti on Soc k et addres s is an IPaddress port pair A port i s a 16 bit i nteger that identifies a proc es s ephemeral port as s igned automatic al ly on c li ent when c lient makes a c onnection request w el l k now n port as s oc iated wi th s ome s ervic e provided by a s erver e g port 80 is as s oci ated with Web s ervers A c onnec tion i s uniquel y identified by the s oc ket addres ses of its endpoints s oc ket pai r cliaddr cliport servaddr servport Berkeley Sockets Interface Created in the early 80 s as part of the original Berkeley distribution of Unix that contained an early version of the Internet protocols Provides a user level interface to the network Underlying basis for all Internet applications Based on client server programming model What is a socket A socket is a descriptor that lets an application read write from to the network Key idea Unix uses the same abstraction for both file I O and network I O Clients and servers communicate with each by reading from and writing to socket descriptors Using regular Unix read and write I O functions The main difference between file I O and socket I O is how the application opens the socket descriptors Key data structures Defined in usr include netinet in h Internet address struct in addr unsigned int s addr 32 bit IP address Internet style socket address struct sockaddr in unsigned short int sin family unsigned short int sin port struct in addr sin addr unsigned char sin zero Address family AF INET Port number IP address Pad to sizeof struct sockaddr Internet style sockets are characterized by a 32 bit IP address and a port Key data structures Defined in usr include netdb h Domain Name Service DNS host entry struct hostent char h name official name of host char h aliases alias list int h addrtype host address type int h length length of address char h addr list list of addresses hostent is a DNS host entry that associates a domain name e g cmu edu with an IP addr 128 2 35 186 Can be accessed from user programs gethostbyname domain name key gethostbyaddr IP address key Can also be accessed from the shell using nslookup or dig Overview of the Sockets Interface Client Server socket socket bind open listenfd open clientfd listen connect connection request accept writen readline readline writen close EOF readline close Await connection request from next client Echo client int main int argc char argv int clientfd port char host buf MAXLINE if argc 3 fprintf stderr usage s host port n argv 0 exit 0 host argv 1 port atoi argv 2 clientfd open clientfd host port while Fgets buf MAXLINE stdin NULL Writen clientfd buf strlen buf Readline clientfd buf MAXLINE Fputs buf stdout Close clientfd Echo client open clientfd int open clientfd char hostname int port int clientfd struct hostent hp struct sockaddr in serveraddr clientfd Socket AF INET SOCK STREAM 0 fill in the server s IP address and port hp Gethostbyname hostname bzero char serveraddr sizeof serveraddr serveraddr sin family AF INET bcopy char hp h addr char serveraddr sin addr s addr hp h length serveraddr sin port htons port establish a connection with the server Connect clientfd SA serveraddr sizeof serveraddr return clientfd Echo client open clientfd socket The client creates a socket that will serve as the endpoint of an Internet AF INET connection SOCK STREAM socket returns an integer socket descriptor int clientfd socket descriptor clientfd Socket AF INET SOCK STREAM 0 Echo client open clientfd gethostbyname The client builds the server s Internet address int clientfd socket descriptor struct hostent hp DNS host entry struct sockaddr in serveraddr server s IP address typedef struct sockaddr SA generic sockaddr fill in the server s IP address and port hp Gethostbyname hostname bzero char serveraddr sizeof serveraddr serveraddr sin family AF INET bcopy char hp h addr char serveraddr sin addr s addr hp h length serveraddr sin port htons port Echo client open clientfd connect Then the client creates a connection with the server The client process suspends blocks until the connection is created with the server At this point the client is ready to begin exchanging messages with the server via Unix I O calls on the descriptor sockfd int clientfd struct sockaddr in serveraddr socket descriptor server address establish a connection with the server Connect clientfd SA serveraddr sizeof serveraddr Echo server int main int argc char argv int listenfd connfd port clientlen struct sockaddr in clientaddr struct hostent hp char haddrp port atoi argv 1 the server listens on a port passed on the command line listenfd open listenfd port while 1 clientlen sizeof clientaddr connfd Accept listenfd SA clientaddr clientlen hp Gethostbyaddr const char clientaddr sin addr s addr sizeof clientaddr sin addr s addr AF INET haddrp inet ntoa clientaddr sin addr printf server connected to s s n hp h name haddrp echo connfd Close connfd Echo server open listenfd int open listenfd int port int listenfd int optval struct sockaddr in serveraddr create a socket descriptor listenfd Socket AF INET SOCK STREAM 0 eliminates Address already in use error from bind optval 1 Setsockopt listenfd SOL SOCKET SO REUSEADDR const void optval sizeof int more Echo server open listenfd listenfd will be an endpoint for all requests to port on any IP address for this host bzero char serveraddr sizeof serveraddr serveraddr sin family AF INET serveraddr sin addr s addr htonl INADDR ANY serveraddr sin port htons unsigned short port Bind listenfd SA serveraddr sizeof serveraddr make it a listening socket ready to accept connection requests Listen listenfd LISTENQ return listenfd Echo server open listenfd socket socket creates a socket descriptor AF INET indicates that the socket is associated with Internet protocols SOCK STREAM selects a reliable byte stream connection int listenfd listening socket descriptor listenfd Socket AF INET SOCK STREAM 0 Echo server open listenfd setsockopt The socket can be given some attributes eliminates Address already in use error from bind optval 1 Setsockopt listenfd SOL SOCKET SO REUSEADDR const void optval sizeof int Handy trick that allows us to rerun the server immediately after we
View Full Document