Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Comnet 2010 - Recitation 2 - Sockets Communication Networks Recitation 2.

Similar presentations


Presentation on theme: "1 Comnet 2010 - Recitation 2 - Sockets Communication Networks Recitation 2."— Presentation transcript:

1 1 Comnet 2010 - Recitation 2 - Sockets Communication Networks Recitation 2

2 2 Comnet 2010 - Recitation 2 - Sockets TCP/IP Socket Programming Cont.

3 3 Comnet 2010 - Recitation 2 - Sockets Outline Send/Receive data Terminating a connection Dealing with blocking calls Client-server model summary

4 4 Comnet 2010 - Recitation 2 - Sockets IP Address/Interfaces Identifies a host interface (not a host)Identifies a host interface (not a host) Interface: connection between host or router and the physical network linkInterface: connection between host or router and the physical network link Hosts may have multiple interfacesHosts may have multiple interfaces 192.18.22.13209.134.16.123

5 5 Comnet 2010 - Recitation 2 - Sockets Sending / Receiving Data With a connection (SOCK_STREAM):With a connection (SOCK_STREAM): –int count = send(sock, &buf, len, flags); count: # bytes transmitted (-1 if error)count: # bytes transmitted (-1 if error) buf: char[], buffer to be transmittedbuf: char[], buffer to be transmitted len: integer, length of buffer (in bytes) to transmitlen: integer, length of buffer (in bytes) to transmit flags: integer, special options, usually just 0flags: integer, special options, usually just 0 –int count = recv(sock, &buf, len, flags); count: # bytes received (-1 if error)count: # bytes received (-1 if error) buf: void[], stores received bytesbuf: void[], stores received bytes len: max # bytes receivedlen: max # bytes received flags: integer, special options, usually just 0flags: integer, special options, usually just 0

6 6 Comnet 2010 - Recitation 2 - Sockets Example of send() … connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); … char *msg = "Comnet is the course!"; int len, bytes_sent; len = strlen(msg); bytes_sent = send(sock, msg, len, 0);

7 7 Comnet 2010 - Recitation 2 - Sockets Sending / Receiving Data (cont’d) Without a connection (SOCK_DGRAM):Without a connection (SOCK_DGRAM): –int count = sendto(sock, &buf, len, flags, &addr, addrlen); count, sock, buf, len, flags: same as sendcount, sock, buf, len, flags: same as send addr: struct sockaddr, address of the destinationaddr: struct sockaddr, address of the destination addrlen: sizeof(addr)addrlen: sizeof(addr) –int count = recvfrom(sock, &buf, len, flags, &addr, &addrlen); count, sock, buf, len, flags: same as recvcount, sock, buf, len, flags: same as recv name: struct sockaddr, address of the sourcename: struct sockaddr, address of the source namelen: sizeof(name): value/result parameternamelen: sizeof(name): value/result parameter

8 8 Comnet 2010 - Recitation 2 - Sockets Sending/Receiving notes send( ) might send only a fraction of the buffersend( ) might send only a fraction of the buffer –Need to push the rest –See sendall( ) in Beej’s guide recv( ) might get several messages together, or a fraction of a messagerecv( ) might get several messages together, or a fraction of a message –Need to be able to identify message’s beginning and end

9 9 Comnet 2010 - Recitation 2 - Sockets Closing connection When finished using a socket, the socket should be closed:When finished using a socket, the socket should be closed: status = close(s);status = close(s); –status: 0 if successful, -1 if error –s: the file descriptor (socket being closed) Closing a socketClosing a socket –closes a connection (for SOCK_STREAM) –frees up the port used by the socket

10 10 Comnet 2010 - Recitation 2 - Sockets Skipping the bind() SOCK_DGRAM:SOCK_DGRAM: –if only sending, no need to bind. The OS finds a port each time the socket sends a packet –if receiving, need to bind SOCK_STREAM:SOCK_STREAM: –The OS binds a port to the client during connection setup

11 11 Comnet 2010 - Recitation 2 - Sockets Dealing with blocking calls Many of the functions we saw block until a certain eventMany of the functions we saw block until a certain event –accept: until a connection comes in –connect: until the connection is established –recv, recvfrom: until a packet (of data) is received –send, sendto: until data is pushed into socket’s buffer For simple programs, blocking is convenientFor simple programs, blocking is convenient What about more complex programs?What about more complex programs? –multiple connections –simultaneous sends and receives –simultaneously doing non-networking processing

12 12 Comnet 2010 - Recitation 2 - Sockets Dealing with blocking (cont’d) Options:Options: –create multi-process or multi-threaded code –turn off the blocking feature using the fcntl() file- descriptor control function –use the select() function call.

13 13 Comnet 2010 - Recitation 2 - Sockets fcntl() function call int fcntl(int filedes, int cmd, args...);int fcntl(int filedes, int cmd, args...); –status: -1 if error –filedes: argument is an open file descriptor –cmd: specifies the operation to be performed –arg: depends upon the value of cmd sockfd = socket(PF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK);

14 14 Comnet 2010 - Recitation 2 - Sockets Using select() What does select do?What does select do? –can be permanent blocking, time-limited blocking or non-blocking –input: a set of file-descriptors –output: info on the file-descriptors’ status –i.e., can identify sockets that are “ready for use”: calls involving that socket will return immediately

15 15 Comnet 2010 - Recitation 2 - Sockets select() function call int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout);int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout); –status: # of ready objects, -1 if error –nfds: 1 + largest file descriptor to check –readfds: set of descriptors to check if read-ready –writefds: set of descriptors to check if write-ready –exceptfds: set of descriptors to check if an exception is registered –timeout: time after which select returns, even if nothing ready - can be 0 or 

16 16 Comnet 2010 - Recitation 2 - Sockets To be used with select(): For sets, select uses a structure, struct fd_setFor sets, select uses a structure, struct fd_set –it is just a bit-vector –if bit i is set in [readfds, writefds, exceptfds], select will check if file descriptor (i.e. socket) i is ready for [reading, writing, exception] Before calling select:Before calling select: –FD_ZERO(&fdvar): clears the structure –FD_SET(i, &fdvar): to check file desc. i After calling select:After calling select: –int FD_ISSET(i, &fdvar): boolean returns TRUE iff i is “ready to read” Standard input (STDIN) is file descriptor 0Standard input (STDIN) is file descriptor 0

17 17 Comnet 2010 - Recitation 2 - Sockets Timeout parameter struct timeval { int tv_sec; // seconds int tv_usec; // microseconds }; Set timeout to NULL for no timeoutSet timeout to NULL for no timeout Set both to 0 for immediate timeoutSet both to 0 for immediate timeout

18 18 Comnet 2010 - Recitation 2 - Sockets Ready to read Listening port is read-ready if accept won’t blockListening port is read-ready if accept won’t block Closed connections are read-ready but recv( ) returns 0 bytesClosed connections are read-ready but recv( ) returns 0 bytes

19 19 Comnet 2010 - Recitation 2 - Sockets Other useful functions bzero(char* c, int n): 0’s n bytes starting at cbzero(char* c, int n): 0’s n bytes starting at c gethostname(char *name, int len): gets the name of the current hostgethostname(char *name, int len): gets the name of the current host gethostbyname(const char *name): converts host’s name to structure containing long integergethostbyname(const char *name): converts host’s name to structure containing long integer char hostname[128]; struct hostent *he; gethostname( hostname, sizeof( hostname) ); printf( “My hostname:%s\n”, hostname ); he = gethostbyname( “www.yahoo.com” ); printf( “Address: %s\n”, inet_n_ntoa( he->h_addr ) );

20 20 Comnet 2010 - Recitation 2 - Sockets Useful functions (cont.) gethostbyaddr(char *addr, int len, int type): converts IP hostname to structure containing long integergethostbyaddr(char *addr, int len, int type): converts IP hostname to structure containing long integer inet_aton(const char *cp, struct in_addr *inp): converts dotted-decimal char-string to binary (network order)inet_aton(const char *cp, struct in_addr *inp): converts dotted-decimal char-string to binary (network order) inet_ntoa(const struct in_addr in): converts binary to dotted-decimal stringinet_ntoa(const struct in_addr in): converts binary to dotted-decimal string struct hostent *he; struct in_addr addr; inet_aton( “66.94.230.32”, &addr ); printf( “Address: %s\n”, inet_ntoa( addr.sin_addr ) ); he = gethostbyaddr( &addr, sizeof( addr ), AF_INET ); printf( “Name: %s\n”, he->h_name );

21 21 Comnet 2010 - Recitation 2 - Sockets UDP Client-Server socket() close() recvfrom() sendto() recvfrom() bind() socket() blocks process request data (request) data (reply) UDP Client UDP Server bind() close()

22 22 Comnet 2010 - Recitation 2 - Sockets TCP Client-Server socket() connect() write() read() close() socket() bind() listen() accept() read() write() close() read() TCP Client TCP Server blocks until connection from client process request end-of-file notification data (reply) data (request) connection establishment 3-way handshake

23 23 Comnet 2010 - Recitation 2 - Sockets Client-server Example request reply telnet ftp Port 20 Port 23 Port 2356 Port 3325 Client 1 Client 2Server IP=132.66.48.37 IP=132.66.48.12IP=132.66.2.1

24 24 Comnet 2010 - Recitation 2 - Sockets Quick Unix reminder ps –efps –ef grepgrep jobsjobs killkill manman ^z + bg^z + bg |, |,


Download ppt "1 Comnet 2010 - Recitation 2 - Sockets Communication Networks Recitation 2."

Similar presentations


Ads by Google