Computer Networks A Tanenbaum 5th Edition
Computer Networks A Tanenbaum 5th Edition
15 mars 2019
Introduction to Sockets
Sockets
Ports(TCP/UDP)
Transport layer
TCP/UDP
Network
socket() socket()
bind()
listen()
connect()
accept()
send()
recv()
send() recv()
close()
close()
1 #i n c l u d e < s t d i o . h>
2 ...
3
4 i n t main ( i n t a r g c , c h a r c o n s t ∗ a r g v [ ] )
5 {
6 i n t s o c k i d , new_sock_id , c l i _ l e n , c h i l d _ p i d ;
7
8
9 struct sockaddr_in cli_addr , serv_addr ;
10
11 // o p e n i n g a TCP s o c k e t ( i n t e r n e t stream s o c k e t ) ∗∗∗∗
12
13 // b i n d i n g the local address
14
15 // s t a r t listening for connections
16
17 // w a i t for c o n n e c t i o n from client
18
19 // A c c e p t t h e call from client and r e p l y the request .
20
21 return 0;
22 }
Listing 2 – Echo Server program (server)
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e <s y s / s o c k e t . h>
3 #i n c l u d e <s y s / t y p e s . h>
4 ...
5
6 i n t main ( i n t a r g c , c h a r c o n s t ∗ a r g v [ ] )
7 {
8 i n t s o c k i d , new_sock_id , c l i _ l e n , c h i l d _ p i d ;
9
10
11 s t r u c t sockaddr_in cli_addr , serv_addr ;
12 // pname=a r g v [ 0 ] ;
13
14 // o p e n i n g a TCP s o c k e t ( i n t e r n e t s t r e a m s o c k e t )
15 i f ( ( s o c k i d = s o c k e t ( AF_INET , SOCK_STREAM, 0 ) ) < 0 )
16 {
17 p e r r o r ( " cannot o p e i n s o c k e t \n" ) ;
18 exit (1);
19 }
20
21 p r i n t f (" socket c r e a t e d \n" ) ;
22
23 // b i n d i n g the local address ∗∗∗∗
24
25 // s t a r t listening for connections
26
27
28 // w a i t for c o n n e c t i o n from client
29
30 // A c c e p t t h e call from client and r e p l y the request .
31
32
33 return 0;
34 }
Listing 3 – Echo Server program (server)
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e <s y s / s o c k e t . h>
3 #i n c l u d e <s y s / t y p e s . h>
4 ...
5
6 i n t main ( i n t a r g c , c h a r c o n s t ∗ a r g v [ ] )
7 {
8 i n t s o c k i d , new_sock_id , c l i _ l e n , c h i l d _ p i d ;
9
10
11 s t r u c t sockaddr_in cli_addr , serv_addr ;
12 // pname=a r g v [ 0 ] ;
13
14 // o p e n i n g a TCP s o c k e t ( i n t e r n e t s t r e a m s o c k e t )
15 i f ( ( s o c k i d = s o c k e t ( AF_INET , SOCK_STREAM, 0 ) ) < 0 )
16 {
17 p e r r o r ( " cannot o p e i n s o c k e t \n" ) ;
18 exit (1);
19 }
20
21 p r i n t f (" socket c r e a t e d \n" ) ;
22
23 b z e r o ( ( c h a r ∗ ) &s e r v _ a d d r , s i z e o f ( s e r v _ a d d r ) ) ;
24 s e r v _ a d d r . s i n _ f a m i l y = AF_INET ;
25 s e r v _ a d d r . s i n _ a d d r . s_addr = h t o n l (INADDR_ANY ) ;
26 s e r v _ a d d r . s i n _ p o r t = h t o n s ( SERV_PORT ) ;
27
28 // b i n d i n g t h e l o c a l a d d r e s s
29 i f ( b i n d ( s o c k i d , ( s t r u c t s o c k a d d r ∗)& s e r v _ a d d r , s i z e o f ( s e r v _ a d d r )) <0)
30 {
31 perror (" bind () f a i l e d " ) ;
32 exit (1);
33 }
34
35
36 p r i n t f ( " b i n d i n g done . . . l i s t e n i n g s t a r t e d \n" ) ;
37
38
39 // s t a r t listening for c o n n e c t i o n s ∗∗∗∗
40
41
42 // w a i t for c o n n e c t i o n from client
43
44 // A c c e p t t h e call from client and r e p l y the request .
45
46
47 return 0;
48 }
Listing 4 – Echo Server program (server)
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e <s y s / s o c k e t . h>
3 #i n c l u d e <s y s / t y p e s . h>
4 ...
5 i n t main ( i n t a r g c , c h a r c o n s t ∗ a r g v [ ] )
6 {
7 i n t s o c k i d , new_sock_id , c l i _ l e n , child_pid ;
8
9
10 s t r u c t sockaddr_in cli_addr , serv_addr ;
11 // pname=a r g v [ 0 ] ;
12
13 // o p e n i n g a TCP s o c k e t ( i n t e r n e t s t r e a m s o c k e t )
14 i f ( ( s o c k i d = s o c k e t ( AF_INET , SOCK_STREAM, 0 ) ) < 0 )
15 {
16 p e r r o r ( " cannot o p e i n s o c k e t \n" ) ;
17 exit (1);
18 }
19
20 p r i n t f (" socket c r e a t e d \n" ) ;
21
22 b z e r o ( ( c h a r ∗ ) &s e r v _ a d d r , s i z e o f ( s e r v _ a d d r ) ) ;
23 s e r v _ a d d r . s i n _ f a m i l y = AF_INET ;
24 s e r v _ a d d r . s i n _ a d d r . s_addr = h t o n l (INADDR_ANY ) ;
25 s e r v _ a d d r . s i n _ p o r t = h t o n s ( SERV_PORT ) ;
26
27 // b i n d i n g t h e l o c a l a d d r e s s
28 i f ( b i n d ( s o c k i d , ( s t r u c t s o c k a d d r ∗)& s e r v _ a d d r , s i z e o f ( s e r v _ a d d r )) <0)
29 {
30 perror (" bind () f a i l e d " ) ;
31 exit (1);
32 }
33 p r i n t f ( " b i n d i n g done . . . l i s t e n i n g s t a r t e d \ n " ) ;
34
35 l i s t e n ( sockid , 5);
36
37 // w a i t for c o n n e c t i o n from client
38
39 // A c c e p t t h e call from client and r e p l y the request .
40
41
42 return 0;
43 }
Listing 5 – Echo Server program (server)
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e <s y s / s o c k e t . h>
3 #i n c l u d e <s y s / t y p e s . h>
4 #i n c l u d e < s t d l i b . h>
5 #i n c l u d e < n e t i n e t / i n . h>
6 #i n c l u d e <a r p a / i n e t . h>
7 #i n c l u d e < s t r i n g . h>
8 #i n c l u d e < u n i s t d . h>
9
10 i n t main ( i n t a r g c , c h a r c o n s t ∗ a r g v [ ] )
11 {
12 i n t s o c k i d , new_sock_id , c l i _ l e n , c h i l d _ p i d ;
13
14
15 s t r u c t sockaddr_in cli_addr , serv_addr ;
16 // pname=a r g v [ 0 ] ;
17
18 // o p e n i n g a TCP s o c k e t ( i n t e r n e t s t r e a m s o c k e t )
19 i f ( ( s o c k i d = s o c k e t ( AF_INET , SOCK_STREAM, 0 ) ) < 0 )
20 {
21 p e r r o r ( " cannot o p e i n s o c k e t \n" ) ;
22 exit (1);
23 }
24
25 p r i n t f (" socket c r e a t e d \n" ) ;
26
27 b z e r o ( ( c h a r ∗ ) &s e r v _ a d d r , s i z e o f ( s e r v _ a d d r ) ) ;
28 s e r v _ a d d r . s i n _ f a m i l y = AF_INET ;
29 s e r v _ a d d r . s i n _ a d d r . s_addr = h t o n l (INADDR_ANY ) ;
30 s e r v _ a d d r . s i n _ p o r t = h t o n s ( SERV_PORT ) ;
31
32 // b i n d i n g t h e l o c a l a d d r e s s
33 i f ( b i n d ( s o c k i d , ( s t r u c t s o c k a d d r ∗)& s e r v _ a d d r , s i z e o f ( s e r v _ a d d r )) <0)
34 {
35 perror (" bind () f a i l e d " ) ;
36 exit (1);
37 }
38 p r i n t f ( " b i n d i n g done . . . l i s t e n i n g s t a r t e d \n" ) ;
39
40 l i s t e n ( sockid , 5);
41
42 c h a r c [ 1 0 0 ] , c_w [ 1 0 0 ] ;
43 i n t rc ,w;
44 // w a i t f o r c o n n e c t i o n f r o m c l i e n t
45 c l i _ l e n= s i z e o f ( c l i _ a d d r ) ;
46 new_sock_id=a c c e p t ( s o c k i d , ( s t r u c t s o c k a d d r ∗)& c l i _ a d d r , &c l i _ l e n ) ;
47 i f ( new_sock_id <0){
48 perror (" accept e r r o r " ) ;
49 exit (1);
50 }
51 r c=r e a d ( new_sock_id , c , s i z e o f ( c ) ) ;
52 w=w r i t e ( new_sock_id , c , s i z e o f ( c ) ) ;
53 close ( sockid );
54 p r i n t f ( " c a l l c l o s e d \n" ) ;
55 return 0;
56 }
socket() system call
Listing 9 – accept()
1 /∗ S e r v e r g e t s a s o c k e t f o r an i n c o m i n g c l i e n t c o n n e c t i o n by calling a c c e p t ( ) ∗/
2 i n t s o c k 1 = a c c e p t ( s o c k i d , &c l i e n t A d d r , &a d d r L e n ) ;
3
4 // s o c k 1 : integer , t h e new s o c k e t ( u s e d for d a t a−t r a n s f e r )
5
6 // s o c k i d : integer , the original socket ( being l i s t e n e d on )
7
8 // c l i e n t A d d r : s t r u c t sockaddr type , a d d r e s s of the active
9 // p a r t i c i p a n t ( f i l l e d i n upon r e t u r n ) .
10
11 // a d d r L e n : sizeof ( clientAddr ): value / r e s u l t parameter
12
13
14 /∗ a c c e p t ( ) i s b l o c k i n g ( w a i t s f o r c o n n e c t i o n b e f o r e b l o c k i n g )
15 I t d e q u e u e s t h e n e x t c o n n e c t i o n on t h e q u e u e f o r s o c k e t ( s o c k i d ) .
16 ∗/
Listing 10 – Exchanging data with stream socket
1 int c o u n t 1 = s e n d ( s o c k i d , msg , msgLen , flags );
2
3 int count2 = r ecv ( sockid , recvBuf , bufLen , flags );
4
5
6 /∗ C a l l s are blocking ( returns only after data is sent / received
7 )
8 ∗/