Professional Documents
Culture Documents
Introduction
Socket characteristics
Socket APIs
I socket: creates a socket of a given domain, type, protocol
(buy a phone)
I bind: assigns a name to the socket (get a telephone number)
I listen: specifies the number of pending connections that
can be queued for a server socket. (call waiting allowance)
I accept: server accepts a connection request from a client
(answer phone)
I connect: client requests a connection request to a server
(call)
I send, sendto: write to connection (speak)
I recv, recvfrom: read from connection (listen)
I shutdown: end the call
TCP
sockets
UDP
Connection-based communication
TCP client
TCP-based sockets
server client
socket socket
bind connect
listen
accept close
send/recv send/recv
shutdown shutdown
close close
TCP
sockets
UDP
socket API
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
4 i n t s o c k e t ( i n t domain , i n t t y p e , i n t p r o t o c o l ) ;
bind
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
Where
I sid: is the socket id
I addrPtr: is a pointer to the address family dependent
address structure
I len: is the size of *addrPtr
Associates a socket id with an address to which other processes
can connect. In internet protocol the address is [ipNumber,
portNumber]
c
TCP
sockets
UDP
sockaddr
c
TCP
sockets
UDP
listen
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
accept
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
accept styles
send
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
c
TCP
sockets
UDP
recv
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
c
TCP
sockets
UDP
shutdown
#i n c l u d e <s y s / t y p e s . h>
2 #i n c l u d e <s y s / s o c k e t . h>
4 i n t shutdown ( i n t s i d , i n t how )
c
TCP
sockets
UDP
connect
c
TCP
sockets
UDP
Denoting Connections
c
TCP
sockets
UDP
Port usage
c
TCP
sockets
UDP
c
TCP
sockets
UDP
gethostname
#i n c l u d e <u n i s t d . h>
2
i n t g e t h o s t n a m e ( c h a r ∗hostname , s i z e t nameLength )
c
TCP
sockets
UDP
hostent structure
struct hostent {
2 c h a r ∗h name ; // o f f i c i a l ( c a n o n i c a l ) name o f t h e h o s t
c h a r ∗∗ h a l i a s e s ; // n u l l t e r m i n a t e d a r r a y of a l t e r n a t i v e hostnames
4 int h addrtype ; // h o s t a d d r e s s t y p e AF INET o r AF INET6
int h length ; // 4 o r 16 b y t e s
6 c h a r ∗∗ h a d d r l i s t ; // IPv4 or IPv6 l i s t of a d d r e s s e s
}
c
TCP
sockets
UDP
Gethostbyname
Auxiliary functions
#i n c l u d e <n e t d b . h>
2
s t r u c t h o s t e n t ∗ g e t h o s t b y n a m e ( c o n s t c h a r ∗hostname )
c
TCP
sockets
UDP
10 // Network t o h o s t b y t e o r d e r f o r l o n g ( 3 2 b i t )
uint 32t ntohl ( uint 32t v );
c
TCP
sockets
UDP
IP Number translation
c
TCP
sockets
UDP
inet pton
#i n c l u d e <a r p a / i n e t . h>
2
i n t i n e t p t o n ( i n t family , const char ∗s tr Pt r ,
4 void ∗addrPtr ) ;
c
TCP
sockets
UDP
inet ntop
#i n c l u d e <a r p a / i n e t . h>
2
i n t i n e t n t o p ( i n t family , const char ∗addrPtr ,
4 char ∗s tr Ptr , s i z e t l e n ) ;
c
TCP
sockets
UDP
4 // g e t a t c p / i p s o c k e t
i n t l i s t e n F d = s o c k e t ( AF INET , SOCK STREAM , 0 ) ;
6
b z e r o (& s e r v e r A d d r , s i z e o f ( s e r v e r A d d r ) ) ;
8 s e r v e r A d d r . s i n f a m i l y = AF INET ;
// any i n t e r n e t i n t e r f a c e on t h i s s e r v e r .
10 s e r v e r A d d r . s i n a d d r . s a d d r = h t o n l (INADDR ANY ) ;
serverAddr . s i n p o r t = htons ( 1 3 ) ;
12
b i n d ( l i s t e n F d , &s e r v e r A d d r C a s t , s i z e o f ( s e r v e r A d d r ) ) ;
14
l i s t e n ( listenFd , 5);
16
for ( ; ; ) {
18 i n t connectFd =
a c c e p t ( l i s t e n F d , ( s o c k a d d r ∗) NULL , NULL ) ;
20 // . . r e a d and w r i t e o p e r a t i o n s on c o n n e c t F d . .
shutdown ( c o n n e c t F d , 2 ) ;
22 c l o s e ( connectFd ) ;
}
Concurrent Server
c
TCP
sockets
UDP
sockaddr in serverAddr ;
2 s o c k a d d r &s e r v e r A d d r C a s t = ( s o c k a d d r &) s e r v e r A d d r ;
4 // g e t a t c p / i p s o c k e t
i n t s o c k F d = s o c k e t ( AF INET , SOCK STREAM , 0 ) ;
6
b z e r o (& s e r v e r A d d r , s i z e o f ( s e r v e r A d d r ) ) ;
8 s e r v e r A d d r . s i n f a m i l y = AF INET ;
// h o s t I P # i n d o t t e d d e c i m a l f o r m a t !
10 i n e t p t o n ( AF INET , s e r v e r N a m e , s e r v e r A d d r . s i n a d d r ) ;
serverAddr . s i n p o r t = htons ( 1 3 ) ;
12
c o n n e c t ( sockFd , s e r v e r A d d r C a s t , s i z e o f ( s e r v e r A d d r ) ) ;
14 // . . r e a d and w r i t e o p e r a t i o n s on s o c k F d . .
shutdown ( sockFd , 2 ) ;
16 c l o s e ( s o c k F d ) ;
TCP
sockets
UDP
Connectionless communication
Connectionless communication
client
socket
bind
sendto/
recvfrom
shutdown
close
TCP
sockets
UDP
UDP variations
sendto
recvfrom
c
TCP
sockets
UDP
Example: UDP—server
i n t s o c k e t I d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ;
2
sockaddr in serverAddr , clientAddr ;
4 s o c k a d d r &s e r v e r A d d r C a s t = ( s o c k a d d r &) s e r v e r A d d r ;
s o c k a d d r &c l i e n t A d d r C a s t = ( s o c k a d d r &) c l i e n t A d d r ;
6
// a l l o w c o n n e c t i o n t o any a d d r on h o s t
8 // f o r h o s t s w i t h m u l t i p l e n e t w o r k c o n n e c t i o n s
// and a s t s e r v e r p o r t .
10 s e r v e r A d d r . s i n f a m i l y = AF INET ;
serverAddr . sin port = htons ( s e r v e r P o r t ) ;
12 s e r v e r A d d r . s i n a d d r . s a d d r = INADDR ANY ;
14 // a s s o c i a t e p r o c e s s w i t h p o r t
b i n d ( s o c k e t I d , &s e r v e r A d d r C a s t , s i z e o f ( a d d r ) ) ;
16
// r e c e i v e from a c l i e n t
18 int size = sizeof ( clientAddr );
recvfrom ( socketId , buffer , bufferSize ,
20 0 , c l i e n t A d d r C a s t , &s i z e ) ;
22 // r e p l y t o t h e c l i e n t j u s t r e c e i v e d from
sendto ( socketId , buffer , bufferSize ,
24 0 , clientAddrCast , size );
26 close ( socketId );
c
TCP
sockets
UDP
Example: UDP—client
14 // no n e e d t o b i n d i f n o t p e e r−to−p e e r
int size = sizeof ( serverAddr );
16 sendto ( socketId , buffer , bufferSize , 0 ,
serverAddrCast , s i z e ) ;
18
recvfrom ( socketId , buffer , bufferSize , 0 ,
20 s e r v e r A d d rC a s t , &s i z e ) ;
22 close ( socketId );