Socket'Programming'151441'Computer'Networks,'Spring'2010'Your'TAs'Lecture'Today'• MoCvaCon 'for'sockets'• What’s'in'a'socket?'• Working'with'socket'• Concurrent'network'applicaCons'• Project'1'Why'Socket?'• How'can'I'program'a'network'applicaCon?'– Share'data'– Send'messages'– Finish'course'projects...'• IPC'1'Interprocess'CommunicaCon'IdenCfy'the'DesCnaCon'Connection socket pair (128.2.194.242:3479 ,208.216.181.15:80 !)HTTP Server (port 80)! Client Client socket address 128.2.194.242:3479 Server socket address 208.216.181.15:80 Client host address 128.2.194.242 Server host address 208.216.181.15 FTP Server (port 21)! • Addressing'– IP'address'– hostname'(resolve'to'IP'address'via'DNS) '• MulCplexing'– port'Sockets'• How'to'use'sockets'– Setup'socket'• Where'is'the'remote'machine'(IP'address,'hostname)'• What'service'gets'the'data'(port)'– Send'and'Receive'• Designed'just'like'any'other'I/O'in'unix'• send'11'write'• recv'11'read'– Close'the'socket'Client / Server Session Client Server socket socket bind listen read write read write Connection request read close close EOF open_listenfd accept connect open_clientfd Overview'Step'1'–'Setup'Socket'• Both%client%and%server%need%to%setup%the%socket''– int$socket(int$domain,$int$type,$int$protocol);$• domain$– AF_INET'11'IPv4'(AF_INET6'for'IPv6)'• type$– SOCK_STREAM'11'TCP'– SOCK_DGRAM'11'UDP'• protocol$– 0'• For'example,'– int$sockfd$=$socket(AF_INET,$SOCK_STREAM,$0);$Step'2'(Server)'1'Binding''• Only%server%need%to%bind%– int$bind(int$sockfd ,$const$struct$sockaddr$*my_addr,$socklen_t$addrlen);$• sockfd$– file'descriptor'socket()'returned'• my_addr$– struct'sockaddr_in'for'IPv4'– cast'(struct'sockad dr_in*) 'to'(struct'sockad dr*)'struct sockaddr_in { short sin_family; // e.g. AF_INET unsigned short sin_port; // e.g. htons(3490)! struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_aton()! };What'is'that'Cast?'• bind()'takes'in'pro tocol1independent'(struct'sockaddr*)'– C’s'polymorphism'– There'are'structs'for'IPv6,'etc.'struct sockaddr { unsigned short sa_family; // address family char sa_data[14]; // protocol address };Step'2'(Server)'1'Binding'contd.'• addrlen$– size'of'the'sockaddr_in''struct sockaddr_in saddr; int sockfd; unsigned short port = 80; if((sockfd=socket(AF_INET, SOCK_STREAM, 0) < 0) { // from back a couple slides printf(“Error creating socket\n”); ... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if((bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { // bind! printf(“Error binding\n”); ... }What'is'htonl(),'htons()?'• Byte'ordering'– Network'order'is'big1endian'– Host'order'can'be'big1'or'lidle1endian'• x86'is'lidle1endian'• SPARC'is'big1endian'• Conversion'– htons(),$htonl():'host'to'network'short/long'– ntohs(),$ntohl():'network'order'to'host'short/long'• What'need'to'be'converted? '– Addresses'– Port'– et c.'Step'3'(Server)'1'Listen'• Now%we%can%listen%– int$listen(int$sockfd,$int$backlog);$• sockfd$– again,$file'descriptor'socket()'returned'• backlog$– number'of'pending'connecCons'to'queue'• For'exampl e,'– listen(sockfd,$5);$Step'4'(Server)'1'Accept'• Server%must%explicitly%accept%incoming%connec<ons%– int$accept(int$sockfd,$struct$sockaddr$*addr,$socklen_t$*addrlen)$• sockfd$– again...$file'descriptor'socket()'returned'• addr$– pointer'to'store'client'address,'(struct'sockaddr_in'*)'cast'to'(struct'sockaddr'*)'• addrlen$– pointer'to'store'the'returned'size'of'ad dr,'should'be'sizeof(*addr)'• For'example'– int$isock=accept(sockfd,$(struct$sockaddr_in$*)$&caddr,$&clen);$Put'Server'Together'struct sockaddr_in saddr, caddr; int sockfd, clen, isock; unsigned short port = 80; if((sockfd=socket(AF_INET, SOCK_STREAM, 0) < 0) { // from back a couple slides printf(“Error creating socket\n”); ... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if((bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { // bind! printf(“Error binding\n”); ... } if(listen(sockfd, 5) < 0) { // listen for incoming connections printf(“Error listening\n”); ... } clen=sizeof(caddr)! if((isock=accept(sockfd, (struct sockaddr *) &caddr, &clen)) < 0) { // accept one printf(“Error accepting\n”); ... }What'about'client?'• Client'need'not'bind,'listen,'and'accept'• All%client%need%to%do%is%to%connect%– int$connect(int$sockfd,$const$struct$sockaddr$*saddr,$socklen_t$addrlen);$• For'exampl e,'– connect(sockfd,$(struct$sockaddr$*)$&saddr,$sizeof(saddr));$Domain'Name'System'(DNS)'• What'if'I'want'to'send'data'to'“www.slashdot.org”? '– DNS:'Conceptually,'DNS'is'a'database'collecCon'of'host'entries'• hostname'1>'IP'address'– struct$hostent$*gethostbyname(const$char$*name);$• IP'address'1>'hostname'– struct$hostent$*gethostbyaddr(const$char$*addr,$int$len,$int$type);$struct hostent { char *h_name; // official hostname char **h_aliases; // vector of alternative hostnames int h_addrtype; // address type, e.g. AF_INET int h_length; // length of address in bytes, e.g. 4 for IPv4 char **h_addr_list; // vector of addresses char *h_addr; // first host address, synonym for h_addr_list[0] };Put'Client'Together'struct sockaddr_in saddr; struct hostent *h; int sockfd, connfd; unsigned short port = 80; if((sockfd=socket(AF_INET, SOCK_STREAM, 0) < 0) { // from back a couple slides printf(“Error creating socket\n”); ... } if((h=gethostbyname(“www.slashdot.org”)) == NULL) {
View Full Document