• Aucun résultat trouvé

sockets

N/A
N/A
Protected

Academic year: 2022

Partager "sockets"

Copied!
55
0
0

Texte intégral

(1)

Exemples de Programmation R´ eseau

Philippe Langevin

Octobre 2007.

(2)

G´en´eralit´e R´esolution Mode UDP Client/Serveur Traitement d´etach´e Mode TCP

Liens

(3)

Mod` ele Client/Serveur

Les applications r´ eseaux sont class´ ees en deux cat´ egories:

I

Serveur qui attend une communication : attente d’une demande d’ouverture de communication, r´ eception d’une requˆ ete et envoie d’une r´ eponse.

I

Client qui initie le lancement d’une communication : demande d’ouverture de connexion, d’une requˆ ete, attente de la

r´ eponse et traitement.

Ouvrage de r´ ef´ erence : Programmation Syst` eme en Langage C

sous Linux, par Christophe Blaess.

(4)

Connexion

I

UDP: application orient´ ee sans connexion, mode non connect´ e.

I

TCP: application orient´ ee connexion.

(5)

Adresses

Les adresses existent sous forme de chaine de caract` eres,

mail.univ-tln.fr 127.0.0.1

o` u encore de mots de 32 bits.

1

256

3

+ 0

256

2

+ 0

256

1

+ 127 = 16777343 ./whoami.exe ./whoami.exe mail.univ-tln.fr hote :msnet.sollies.fr hote :mail.univ-tln.fr

addr :16777343 addr :39858625 ip :127.0.0.1 ip :193.49.96.2

I

compl´ et´ ee par un num´ ero de port de 32 bits.

(6)

Who am I ?

i n t main ( i n t a r g c , c h a r∗ a r g v [ ] ) { s t r u c t i n a d d r num ;

s t r u c t h o s t e n t ∗i n f o s ; c h a r nom [MAXNAME ] ; i f ( a r g c > 1 )

i n f o s = g e t h o s t b y n a m e( a r g v [ 1 ] ) ; e l s e {

g e t h o s t n a m e ( nom ,MAXNAME) ; i n f o s = g e t h o s t b y n a m e( nom ) ; }

i f ( i n f o s ) {

p r i n t f ("\ nhote :% s ", i n f o s−>h name ) ; memcpy ( &num , i n f o s −> h a d d r l i s t [ 0 ] , 4 ) ;

p r i n t f ("\ naddr :% lu ", (u n s i g n e d l o n g) num . s a d d r ) ; p r i n t f ("\ nip :% s", i n e t n t o a( num ) ) ;

}

p r i n t f ("\n") ; r e t u r n 0 ; }

(7)

structures hostent & in addr

s t r u c t i n a d d r { u n s i g n e d l o n g i n t s a d d r ; }

#i n c l u d e <n e t d b . h>

s t r u c t h o s t e n t {

c h a r ∗h name ; /∗ Nom o f f i c i e l de l ’ h o t e .∗/

c h a r ∗∗h a l i a s e s ; /∗ L i s t e d ’ a l i a s . ∗/

i n t h a d d r t y p e ; /∗ Type d ’ a d r e s s e de l ’ h o t e .∗/

i n t h l e n g t h ; /∗ L o n g u e u r de l ’ a d r e s s e .∗/

c h a r ∗∗h a d d r l i s t ; /∗ L i s t e d ’ a d r e s s e s .∗/

}

#d e f i n e h a d d r h a d d r l i s t [ 0 ] /∗ p o u r r e t r o−c o m p a t i b i l i t\’ e . ∗/

I

h aliases: table d’alternatives au nom officiel de l’hˆ ote, termin´ ee par un pointeur

null

.

I

h addrtype : toujours AF INET ou AF INET6.

I

h length : la longueur, en octets, de l’adresse.

I

h addr list: une table, termin´ ee par un pointeur

null

, d’adresses r´ eseau pour l’hˆ ote, avec l’ordre des octets du r´ eseau.

I

h addr: premi` ere adresse dans h addr list pour respecter la

compatibilite ascendante.

(8)

R´ esolution des noms

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 ∗name ) ;

I

La fonction

gethostbyname()

renvoie une structure de type

hostent

pour l’hˆ ote name. La chaˆıne name est soit un nom d’hˆ ote, soit une adresse IPv4 en notation point´ ee standard, soit une adresse IPv6 avec la notation points-virgules et points. Si name est une adresse IPv4 ou IPv6, aucune

recherche suppl´ ementaire n’a lieu et

gethostbyname()

copie

simplement la chaˆıne name dans le champ h name et le

champ ´ equivalent

struct in addr

dans le champ

h addr list[0]

de la structure hostent renvoy´ ee.

(9)

R´ esolution inverse

#i n c l u d e <s y s / t y p e s . h> #i n c l u d e <s y s / s o c k e t . h>

e x t e r n i n t h e r r n o ;

s t r u c t h o s t e n t ∗g e t h o s t b y a d d r (c o n s t v o i d ∗a d d r , i n t l e n , i n t t y p e ) ;

I

La fonction

gethostbyaddr()

renvoie une structure du type hostent pour l’hˆ ote d’adresse addr. Cette adresse est de longueur len et du type donn´ e. Les types d’adresse valides sont AF INET et AF INET6. L’argument adresse de l’hˆ ote est un pointeur vers une structure de type d´ ependant du type de l’adresse, par exemple

struct in addr *

(probablement obtenu via un appel

inet addr()) pour une adresse de type

AF INET.

I

Retour: Les fonctions

gethostbyname()

et

gethostbyaddr()

renvoient un pointeur sur la structure

hostent , ou bien un pointeur

null

si une erreur se produit,

auquel cas

h errno

contient le code d’erreur.

(10)

Manipulation des adresses

#i n c l u d e <s y s / s o c k e t . h>

#i n c l u d e <n e t i n e t / i n . h>

#i n c l u d e <a r p a / i n e t . h>

s t r u c t i n a d d r {

u n s i g n e d l o n g i n t s a d d r ; }

i n a d d r t i n e t a d d r (c o n s t c h a r ∗ cp ) ; c h a r ∗ i n e t n t o a (s t r u c t i n a d d r i n ) ;

I

La fonction

inet ntoa()

convertit l’adresse Internet de l’hˆ ote in donn´ ee dans l’ordre des octets du r´ eseau en une chaˆıne de caract` eres dans la notation avec nombres et points. La chaine est renvoy´ ee dans un buffer

I

La fonction

inet addr()

convertit l’adresse Internet de l’hˆ ote

cp depuis la notation standard avec nombres et points en une

donn´ ee binaire dans l’ordre des octets du r´ eseau.

(11)

Manipulation des adresses

#i n c l u d e . . .

i n t i n e t a t o n (c o n s t c h a r ∗cp , s t r u c t i n a d d r ∗i n p ) ; i n a d d r t i n e t n e t w o r k (c o n s t c h a r ∗ cp ) ;

I inet aton()

convertit l’adresse Internet de l’hˆ ote cp depuis la nota- tion standard avec nombres et points en une donn´ ee binaire, et la stocke dans la structure point´ ee par inp.

inet aton

renvoie une valeur non nulle si l’adresse est valide, et z´ ero sinon.

I

La fonction

inet network()

extrait la partie r´ eseau de

l’adresse cp fournie dans la notation avec nombres et points,

et renvoie cette valeur dans l’ordre des octets de l’hˆ ote. Si

l’adresse est invalide, -1 est renvoy´ e.

(12)

Mode non connect´ e

bind

recevfrom sendto

close socket

close recevfrom

sendto

socket bind

SERVEUR CLIENT

(13)

Cr´ eer un point de communication.

#i n c l u d e <s y s / t y p e s . h>

#i n c l u d e <s y s / s o c k e t . h>

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 ) ;

Cr´ eation d’un point de communication, et renvoie un descripteur.

I

domain indique un domaine de communication, l’int´ erieur duquel s’´ etablira le dialogue PF-INET pour IPv4 et PF-INET6 pour IPv6.

I

type fixe la s´ emantique du dialogue : SOCK-STREAM, SOCK-DGRAM

I

protocol num´ ero de protocol.

I

Quand une session se termine, on referme la socket avec close.

I

retour un descripteur r´ ef´ erenant la socket cr´ e´ ee en cas de

r´ eussite. En cas d’´ echec -1 est renvoy´ e, et

errno

contient le

code d’erreur.

(14)

Assigner un nom ` a une socket.

#i n c l u d e <s y s / t y p e s . h>

#i n c l u d e <s y s / s o c k e t . h>

i n t b i n d (i n t s o c k f d , s t r u c t s o c k a d d r ∗my addr , s o c k l e n t a d d r l e n ) ;

Fournit ` a la socket sockfd, l’adresse locale my addr. my addr est longue de addrlen octets. Traditionnellement cette op´ eration est appel´ ee “assignation d’un nom ` a une socket”.

I

La plage de port 1–511 est r´ eserv´ ee au root.

I

Plage des ports libres: 5001–65535

I

Attention ` a l’ordre des octets.

I

retour :renvoie 0 s’il r´ eussit, ou -1 s’il ´ echoue, auquel cas

errno con- tient le code d’erreur.

(15)

Conversion des entiers

#i n c l u d e <s y s / t y p e s . h>

u l o n g h t o n l ( u l o n g ) ; /∗ h o s t t o n e t w o r k −− l o n g ∗/

u s h o r t h t o n s ( u s h o r t ) ; /∗ h o s t t o n e t w o r k −− s h o r t ∗/

u l o n g n t o h l ( u l o n g ) ; /∗ n e t w o r k t o h o s t −− l o n g ∗/

u s h o r t n t o h s ( u s h o r t ) ; /∗ n e t w o r k t o h o s t −− s h o r t ∗/

I

La fonction

ntohl()

convertit un entier non-sign´ e netlong depuis l’ordre des octets du r´ eseau vers celui de l’hˆ ote.

I ntohl()

fait le contraire.

I

Pour affecter le num´ ero de port 13 (service “daytime”) au

champ

sin port

d’une structure de type

sockaddr in

:

s a d d r . s i n p o r t = h t o n s ( 1 3 ) ;

(16)

Recevoir un message

#i n c l u d e <s y s / t y p e s . h> #i n c l u d e <s y s / s o c k e t . h>

i n t r e c v f r o m (i n t s , v o i d ∗b u f , i n t l e n , u i n t f l a g s , s t r u c t s o c k a d d r ∗from , s o c k l e n t ∗f r o m l e n ) ;

L’appel-syst` eme

recvfrom

est utilis´ e pour recevoir un message depuis une socket s (socket orient´ ee connexion ou non).

I

L’adresse de la source du messages est ins´ er´ ee dans from.

L’argument fromlen est un param` etre r´ esultat, initialis´ e ` a la taille du buffer from, et modifi´ e en retour pour indiquer la taille r´ eelle de l’adresse enregistr´ ee.

I

La r´ eception se mettent en attente, ` a moins que la socket soit non blo- quante auquel cas la valeur -1 est renvoy´ ee, et

errno

est positionn´ ee ` a EAGAIN. Les fonctions de r´ eception

renvoient nor- malement les donn´ ees disponibles sans attendre d’avoir re¸ u le nombre exact r´ eclam´ e.

I

La routine renvoie le nombre d’octets lus si elle r´ eussit. Si un

message est trop long pour tenir dans le buffer, les octets

suppl´ ementaires peuvent ˆ etre abandonn´ es.

(17)

Serveur en mode non connect´ e

c h a r b f r [ 1 0 2 4 ] , ∗p t r ;

s t r u c t s o c k a d d r i n s e r v , c l i e n t ; s t r u c t s o c k a d d r aux ;

s d = s o c k e t( AF INET , SOCK DGRAM, 0 ) ; memset ( &s e r v , 0 , s i z e o f( s e r v ) ) ;

s e r v . s i n f a m i l y = AF INET ; s e r v . s i n p o r t = h t o n s( 31415 ) ; memcpy ( &s e r v . s i n a d d r , IPno , 4 ) ;

b i n d( sd , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) ; w h i l e ( 1 ) {

nb = r e c v f r o m( sd , &b f r , 1024 , 0 , &aux , & t a i l l e ) ; memcpy ( & c l i e n t , &aux , s i z e o f( aux ) ) ;

p t r = i n e t n t o a ( c l i e n t . s i n a d d r ) ; p r i n t f ("\n%d octets < -(%s ): ", nb , p t r ) ; f o r( i = 0 ; i < nb ; i ++)

i f ( i s p r i n t ( b f r [ i ] ) ) p r i n t f ("%c", b f r [ i ] ) ; }

c l o s e( s d ) ; r e t u r n 0 ; }

(18)

Structure sockaddr &sockaddr in

s t r u c t s o c k a d d r {

u n s i g n e d s h o r t s a f a m i l y ;

c h a r s a d a t a [ 1 4 ] ; /∗ p r o t o c o l a d d r e s s ∗/

};

s t r u c t s o c k a d d r i n {

s h o r t i n t s i n f a m i l y ;

u n s i g n e d s h o r t i n t s i n p o r t ; s t r u c t i n a d d r s i n a d d r ; u n s i g n e d c h a r s i n z e r o [ 8 ] ; };

I sa family

: AF UNIX et AF INET sont les plus courantes.

I sa data

: addresse de destination et num´ ero de port, nom de fichier dans le cas AF UNIX.

I

La structure g´ en´ erique

sockaddr

est plutˆ ot le difficile ` a manier,

sockaddr in

sp´ ecifique au socket “internet”.

I

taille identique, transtypage.

(19)

netstat & client dig

[ p l @ o u 8 1 2 ] . / u d p s e r v e u r . e x e &

[ 2 ] 4078

[ p l @ o u 8 1 2 ] n e t s t a t −ap | g r e p 31415

udp 0 0 ou812 . u n i v−t l n . f r : 3 1 4 1 5 ∗:∗ 16257/ s d c s e r v . e x e

[ p l @ o u 8 1 2 ] s s h m a i t i n f o 1

[ p l @ m a i t i ] d i g H e l l o W o r l d @10 . 2 . 7 3 . 8 6 −p31415 28 o c t e t s <− 1 0 . 9 . 1 8 5 . 2 1 7 x H e l l o W o r l d 28 o c t e t s <− 1 0 . 9 . 1 8 5 . 2 1 7 x H e l l o W o r l d

; <<>> DiG 9 . 3 . 2 <<>> H e l l o W o r l d @10 . 2 . 7 3 . 8 6 −p31415

; ( 1 s e r v e r f o u n d )

; ; g l o b a l o p t i o n s : p r i n t c m d

; ; c o n n e c t i o n t i m e d o u t ; no s e r v e r s c o u l d be r e a c h e d

(20)

client telnet & nmap

[ p l @ o u 8 1 2 ] t e l n e t 1 0 . 2 . 7 3 . 8 6 31415 T r y i n g 1 0 . 2 . 7 3 . 8 6 . . .

t e l n e t : c o n n e c t t o a d d r e s s 1 0 . 2 . 7 3 . 8 6 : C o n n e c t i o n r e f u s e d t e l n e t : U n a b l e t o c o n n e c t t o r e m o t e h o s t : C o n n e c t i o n r e f u s e d [ p l @ o u 8 1 2 ] s u

[ r o o t ] nmap −sU −p31414−31416 1 0 . 2 . 7 3 . 8 6 S t a r t i n g Nmap 4 . 0 3

0 o c t e t s <− 1 0 . 2 . 7 3 . 8 6 I n t e r e s t i n g p o r t s on ( 1 0 . 2 . 7 3 . 8 6 ) :

PORT STATE SERVICE

31414/ udp c l o s e d unknown

31415/ udp open| f i l t e r e d unknown

31416/ udp c l o s e d unknown

Nmap f i n i s h e d : 1 I P a d d r e s s ( 1 h o s t up )

(21)

Un client/serveur

0 0

stop

job

result

requete reception

Σ

f(x) proc++

X−−

proc++

X>0 proc>0 proc := 0

x := N

(22)

option : sdcserveur

s w i t c h ( o p t ) {

c a s e ’p ’ : PORT = a t o i ( o p t a r g ) ; break;

c a s e ’s ’ : SERV = o p t a r g ; break;

c a s e ’n ’ : NMAX = a t o i ( o p t a r g ) ; break;

c a s e ’h ’ : p r i n t f ("\ nusage %s: -p port -n max ", a r g v [ 0 ] ) ; p r i n t f ("\ nusage %s: -s serveur \n", a r g v [ 0 ] ) ; d e f a u l t : r e t u r n 0 ;

} };

r e t u r n 1 ; }

(23)

main : sdcserveur

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t sd , r e s = 0 ;

s t r u c t s o c k a d d r i n s e r v ;

i f ( ! a r g o k ( a r g c , a r g v ) ) r e t u r n 1 ; s d = s o c k e t( AF INET , SOCK DGRAM, 0 ) ; s e r v = s o c k a d d r i n l o c a l( PORT ) ;

b i n d( sd , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) ; r e s = s d c n e t ( sd , NMAX ) ;

p r i n t f ("\ nSomme %d premiers carres : %d", NMAX, r e s ) ; c l o s e( s d ) ;

r e t u r n 0 ; }

(24)

sockaddrinlocal:socktools.c

s t r u c t s o c k a d d r i n s o c k a d d r i n l o c a l ( i n t p o r t ) { s t r u c t s o c k a d d r i n r e s ;

memset ( &r e s , 0 , s i z e o f( r e s ) ) ; r e s . s i n f a m i l y = AF INET ;

r e s . s i n p o r t = h t o n s ( p o r t ) ;

r e s . s i n a d d r . s a d d r = h t o n l ( INADDR ANY ) ; r e t u r n r e s ;

}

(25)

sdcnet : sdcserveur

i n t s d c n e t ( i n t sd , i n t n ) { i n t r e s = 0 , v a l , n b p r o c = 0 ;

s t r u c t s o c k a d d r c l i e n t ; w h i l e ( n | | n b p r o c ) {

v a l = r e c v p a q u e t f r o m( sd , & c l i e n t ) ; p r i n t f r o m ( & c l i e n t ) ;

i f ( v a l ) {

p r i n t f (" -> %d", v a l ) ; r e s += v a l ;

n b p r o c−−;

} e l s e {

s e n d p a q u e t t o( sd , & c l i e n t , n ) ; i f ( n ) { n b p r o c ++; n−−;}

}

p r i n t f ("\n%d actifs , reste =% d sdc =% d", n b p r o c , n , r e s ) ; }

s e n d p a q u e t t o( sd , & c l i e n t , 0 ) ; r e t u r n r e s ;

}

v o i d o p t i o n o l d ( c h a r∗ s t r )

{ i f ( ∗s t r != ’-’) ∗s t r =’h ’; e l s e s t r ++;

s w i t c h ( ∗s t r ) {

c a s e ’p ’ : s t r ++; PORT = a t o i ( s t r ) ; break; c a s e ’n ’ : s t r ++; NMAX = a t o i ( s t r ) ; break; c a s e ’h ’ : p r i n t f ("\ nusage : - port - nmax \n") ; d e f a u l t : e x i t ( 1 ) ;

}; }

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t sd , r e s = 0 ;

s t r u c t s o c k a d d r i n s e r v ;

i f ( ! a r g o k ( a r g c , a r g v ) ) r e t u r n 1 ; s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; s e r v = s o c k a d d r i n l o c a l ( PORT ) ;

b i n d ( sd , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) ; r e s = s d c n e t ( sd , NMAX ) ;

p r i n t f ("\ nSomme %d premiers carres : %d", NMAX, r e s ) ; c l o s e ( s d ) ;

r e t u r n 0 ; }

(26)

paquet : socktools.c

nb = s e n d t o( sd , &v a l , 4 , 0 , c l i e n t , TAILLE ) ; i f ( nb < 0 ) e r r e u r (" sendto ") ;

}

i n t r e c v p a q u e t f r o m ( i n t sd , s t r u c t s o c k a d d r ∗c l i e n t ) { i n t v a l , nb ;

nb = r e c v f r o m( sd , &v a l , 4 , 0 , c l i e n t , &TAILLE ) ; i f ( nb < 0 ) e r r e u r (" recvfrom ") ;

r e t u r n v a l ; }

i n t n o b l o q p a q u e t f r o m ( i n t sd , s t r u c t s o c k a d d r ∗c l i e n t ) { i n t v a l , nb ;

nb = r e c v f r o m( sd ,& v a l , 4 , MSG DONTWAIT, c l i e n t ,& TAILLE ) ; i f ( nb < 0 ) { v a l = − 1 ;

i f ( e r r n o != EAGAIN ) e r r e u r (" nb recvfrom ") ; }

r e t u r n v a l ; }

i n t a r g o k ( i n t a r g c , c h a r∗ a r g v [ ] ) { i n t o p t ;

c h a r ∗ o p t l i s t e = "p:n:s:h";

w h i l e ( ( o p t = g e t o p t ( a r g c , a r g v , o p t l i s t e ) ) >= 0 ) { s w i t c h ( o p t ) {

c a s e ’p ’ : PORT = a t o i ( o p t a r g ) ; break;

c a s e ’s ’ : SERV = o p t a r g ; break;

c a s e ’n ’ : NMAX = a t o i ( o p t a r g ) ; break;

c a s e ’h ’ : p r i n t f ("\ nusage %s: -p port -n max ", a r g v [ 0 ] ) ; p r i n t f ("\ nusage %s: -s serveur \n", a r g v [ 0 ] ) ; d e f a u l t : r e t u r n 0 ;

} };

r e t u r n 1 ; }

(27)

Envoyer un message

i n t s e n d t o (i n t s , c o n s t v o i d ∗b u f , s i z e t l e n , i n t f l a g s , c o n s t s t r u c t s o c k a d d r ∗to , s o c k l e n t t o l e n ) ;

Les appels syst` emes

send(),sendto(), et sendmsg()

permettent de transmettre un message ` a destination d’une autre socket. Si

sendto()

est utilis´ ee sur une socket en mode connexion (SOCK STREAM, SOCK SEQPACKET), les param` etres to et tolen sont ignor´ es. Autrement, l’adresse de la cible est fournie par to, tolen sp´ ecifiant sa taille.

I

Retour : S’ils r´ eussissent, ces appels syst` emes renvoient le

nombre de caract` eres ´ emis. S’ils ´ echouent, ils renvoient -1 et

errno

contient le code d’erreur.

(28)

main:sdclient

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t s d ;

s t r u c t s o c k a d d r i n s e r v ;

i f ( ! a r g o k ( a r g c , a r g v ) ) r e t u r n 1 ; s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; i f ( s d < 0 ) e r r e u r (" socket ") ;

s e r v = s o c k a d d r i n b y n a m e( SERV , PORT ) ;

c a l c u l( s d , (s t r u c t s o c k a d d r∗) &s e r v ) ; c l o s e ( s d ) ;

r e t u r n 0 ; }

(29)

sockaddrinbyname:socktools.c

s t r u c t s o c k a d d r i n s o c k a d d r i n b y n a m e (c h a r ∗nom , i n t p o r t ) { s t r u c t s o c k a d d r i n r e s ;

s t r u c t h o s t e n t∗ i n f o s ;

i n f o s = g e t h o s t b y n a m e ( nom ) ; memset ( &r e s , 0 , s i z e o f( r e s ) ) ;

r e s . s i n f a m i l y = AF INET ; r e s . s i n p o r t = h t o n s ( p o r t ) ;

memcpy(& r e s . s i n a d d r , i n f o s −> h a d d r l i s t [ 0 ] , 4 ) ; r e t u r n r e s ;

}

s t r u c t s o c k a d d r i n s o c k a d d r i n l o c a l ( i n t p o r t ) { s t r u c t s o c k a d d r i n r e s ;

memset ( &r e s , 0 , s i z e o f( r e s ) ) ; r e s . s i n f a m i l y = AF INET ;

r e s . s i n p o r t = h t o n s ( p o r t ) ;

r e s . s i n a d d r . s a d d r = h t o n l ( INADDR ANY ) ; r e t u r n r e s ;

}

(30)

calcul:sdclient

v o i d c a l c u l ( i n t sd , s t r u c t s o c k a d d r ∗s e r v ) { i n t v a l ;

w h i l e ( 1 ) { v a l = 0 ;

s e n d p a q u e t t o ( sd , s e r v , v a l ) ; v a l = r e c v p a q u e t f r o m ( sd , s e r v ) ; i f ( ! v a l ) r e t u r n;

v a l = v a l ∗ v a l ;

s l e e p ( random ( ) % 1 0 ) ;

s e n d p a q u e t t o ( sd , s e r v , v a l ) ; }

}

(31)

Grappe de machines

h a l 9 0 0 0 . u n i v−t l n . f r g r i m 1 g i t a n e . u n i v−t l n . f r z a n o t t i 1

(32)

Synchronisation des codes

#! / b i n / b a s h g r a p p e=$1 rm ko . g r p t o u c h ko . g r p

w h i l e read h o s t l o g i n max do

p i n g −c1 −w2 $ h o s t >/d e v / n u l l ALIVE=$ ?

i f [ " $ALIVE " == "0" ] then

r s y n c −av ∗. c −−d e l e t e $ l o g i n @ $ h o s t : SOCKET/

r s y n c −av ∗. h −−d e l e t e $ l o g i n @ $ h o s t : SOCKET/

r s y n c −av M a k e f i l e −−d e l e t e $ l o g i n @ $ h o s t : SOCKET/

s s h $ l o g i n @ $ h o s t " cd SOCKET ; make -f Makefile " < / d e v / n u l l e l s e

echo " $host $login $max " >> ko . g r p f i

done < $ g r a p p e echo " ko are :"

c a t ko . g r p

cp ko . g r p tempo . g r p

(33)

Lancement

#! / b i n / b a s h

g r a p p e=g r a p p e . g r p p o r t =31415

s e r v=ou812 . u n i v−t l n . f r max=5

. / i n s t a l l . s h $ g r a p p e

#. / $1 −p $ p o r t −n $max &

ps aux | g r e p $1 rm nohup. o u t

w h i l e read h o s t l o g i n max do

p i n g −c1 −w2 $ h o s t >/d e v / n u l l ALIVE=$ ?

i f [ " $ALIVE " == "0" ] then

w h i l e [ $max != 0 ] do l e t max=$max−1

s s h $ l o g i n @ $ h o s t " nice SOCKET / $2 -s $serv -p $port "

< / d e v / n u l l &

done f i

done < $ g r a p p e

(34)

Output

f r o m 1 0 . 2 . 7 3 . 1 2 7 i n c h i l d −> 25 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 9 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 4 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 1 f r o m 1 0 . 2 . 7 3 . 1 2 7 i n c h i l d −> 25 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 9 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 4 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 1 f r o m 1 0 . 2 . 7 3 . 1 2 7 i n c h i l d −> 25 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 9 f r o m 1 0 . 2 . 8 1 . 4 2 i n c h i l d −> 4 f r o m 1 0 . 9 . 1 8 5 . 2 1 7 i n c h i l d −> 1

(35)

Capture de trames tcpdump

[ r o o t @ o u 8 1 2 ˜]# tcpdump −n p o r t 3000

tcpdump : v e r b o s e o u t p u t s u p p r e s s e d , u s e −v o r −v v f o r f u l l p r o t o c o l d e c o d e l i s t e n i n g on e t h 0 , l i n k−t y p e EN10MB ( E t h e r n e t ) , c a p t u r e s i z e 96 b y t e s 1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2

1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 : UDP, l e n g t h 3 1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 : UDP, l e n g t h 2 1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 3 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 8 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 3 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 7 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 7 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 4 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 8 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 8 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 9 . 1 8 5 . 2 0 1 . 3 2 8 1 6 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 0 1 . 3 2 8 1 6 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 5 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 4 9 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 5 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 4 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 3 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 3 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 1 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 3 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 7 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 7 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 7 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 4 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 8 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 8 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 1 7 . 3 3 3 2 8 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 0 1 . 3 2 8 1 6 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 3 1 0 : 4 8 : 5 2 . I P 1 0 . 9 . 1 8 5 . 2 0 1 . 3 2 8 1 6 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 9 . 1 8 5 . 2 0 1 . 3 2 8 1 6 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 5 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 5 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 2 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 8 1 . 4 2 . 3 2 7 7 5 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 7 9 4 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 > 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 : UDP, l e n g t h 2 1 0 : 4 8 : 5 7 . I P 1 0 . 2 . 7 3 . 8 6 . 3 0 0 0 > 1 0 . 2 . 7 3 . 8 5 . 3 2 7 7 4 : UDP, l e n g t h 2

(36)

Gestion d´ etach´ ee

Les clients lancent leur requˆ ete sur le serveur qui d´ etache un processus pour la gestion du client.

I

communication interprocessus par socket

I

communication interprocessus par tube

I

m´ emoire partag´ ee.

(37)

Communication interprocessus par tube

x := N

X>0

0 X−−

Σ

f(x) x

job

result

result

sous processsus

sous processsus requete

reception

(38)

Tube de communication, pipe

1: write NOYAU processsus

0: read

sous processsus

tube

(39)

Signal SIGCHILD, zombie

sous processsus processsus

NOYAU

exit, return, abort wait

signal

(40)

Nouveau client

v o i d c a l c u l ( i n t sd , s t r u c t s o c k a d d r ∗s e r v ) { i n t v a l , r e t r y ;

s t r u c t s o c k a d d r s l a v e ; w h i l e ( 1 ) {

s e n d p a q u e t t o ( sd , s e r v , 0 ) ; r e t r y = 2 ;

do {

v a l = n o b l o q p a q u e t f r o m( sd , &s l a v e ) ; i f ( v a l < 0 ) {

p r i n t f ("\ nPas de reponse %d %s", r e t r y , name ) ; s l e e p ( 1 ) ;

}

r e t r y−−;

} w h i l e ( ( v a l < 0 ) && r e t r y ) ; i f ( v a l <= 0 ) r e t u r n;

p r i n t f ("\ njob = %d %s", v a l , name ) ; v a l = v a l ∗ v a l ; s l e e p ( 5 ) ;

s e n d p a q u e t t o ( sd , &s l a v e , v a l ) ; }

}

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t s d ;

s t r u c t s o c k a d d r i n s e r v ;

(41)

Code du serveur fork

i n t s d c n e t ( i n t sd , i n t n )

{ i n t somme = 0 , v a l , nb , s t a t u s ; s t r u c t s o c k a d d r aux ;

i n t p i d , t u b e [ 2 ] ;

i f ( p i p e( t u b e ) < 0 ) e r r e u r (" pipe ") ;

w h i l e ( n ) {

v a l = r e c v p a q u e t f r o m ( sd , &aux ) ; p i d = f o r k ( ) ;

i f ( p i d == 0 ) {

c l o s e ( t u b e [ 0 ] ) ;

t a c h e( t u b e [ 1 ] , &aux , n ) ;

c l o s e ( t u b e [ 1 ] ) ; c l o s e ( s d ) ; e x i t ( 0 ) ; };

n−−;

}

w h i l e ( ( p i d = w a i t( &s t a t u s ) ) >= 0 ) {

f p r i n t f ( s t d o u t , "\ nsignal du fils pid = %d", p i d ) ; nb = r e a d( t u b e [ 0 ] , &v a l , 4 ) ;

i f ( nb != 4 ) e r r e u r (" read ") ; somme += v a l ;

}

r e t u r n somme ; }

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t sd , r e s = 0 ;

s t r u c t s o c k a d d r i n s e r v ;

i f ( ! a r g o k ( a r g c , a r g v ) ) r e t u r n 1 ; s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; i f ( s d < 0 ) e r r e u r (" socket ") ;

s e r v = s o c k a d d r i n l o c a l ( PORT ) ;

i f ( b i n d ( sd , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) < 0 ) e r r e u r (" bind ") ;

r e s = s d c n e t ( sd , NMAX ) ;

p r i n t f ("\ nSomme %d premiers carres : %d\n", NMAX, r e s ) ; f f l u s h ( s t d o u t ) ;

c l o s e ( s d ) ; r e t u r n 0 ; }

(42)

Tache du fork serveur

i n t t a c h e ( i n t dt , s t r u c t s o c k a d d r ∗c l i e n t , i n t n ) { i n t sd , r e s , nb ;

s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; s e n d p a q u e t t o ( sd , c l i e n t , n ) ;

r e s = r e c v p a q u e t f r o m ( sd , c l i e n t ) ;

f p r i n t f ( s t d o u t , "\ nfils %d <- %d", g e t p i d ( ) , r e s ) ; p r i n t f r o m ( c l i e n t ) ;

nb = w r i t e( dt , &r e s , 4 ) ; i f ( nb != 4 ) e r r e u r (" write ") ; c l o s e ( s d ) ;

r e t u r n r e s ;

(43)

Output

[ d r m i c h k o @ m s n e t SOCKET ] $ . / s d c s e r v f o r k t u b e . e x e −p 31415 −n 5 f i l s 4051 <− 25 ( 1 9 2 . 1 6 8 . 0 . 3 0 )

f i l s 4052 <− 16 ( 1 9 2 . 1 6 8 . 0 . 3 0 ) f i l s 4054 <− 9 ( 1 9 2 . 1 6 8 . 0 . 3 0 ) f i l s 4056 <− 4 ( 1 9 2 . 1 6 8 . 0 . 3 0 ) s i g n a l du f i l s p i d = 4051

s i g n a l du f i l s p i d = 4052 s i g n a l du f i l s p i d = 4054 s i g n a l du f i l s p i d = 4056

f i l s 4057 <− 1 ( 1 9 2 . 1 6 8 . 0 . 3 0 ) s i g n a l du f i l s p i d = 4057

Somme 5 p r e m i e r s c a r r e s : 55

(44)

[root@ou812]tcpdump -n host ou812 and udp

1 6 : 5 6 : 5 7 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 6 : 5 7 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 4 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 : UDP, l e n g t h 4 1 6 : 5 6 : 5 7 I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 6 : 5 7 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 5 > 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 4 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 6 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 5 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 7 : 0 3 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 7 > 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 : UDP, l e n g t h 4 1 6 : 5 7 : 0 9 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 6 : UDP, l e n g t h 4 1 6 : 5 7 : 0 9 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 7 : 0 9 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 8 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 : UDP, l e n g t h 4 1 6 : 5 7 : 0 9 I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 7 : UDP, l e n g t h 4 1 6 : 5 7 : 0 9 I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4 1 6 : 5 7 : 1 4 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 > 1 0 . 1 . 6 5 . 1 . domain : 56074+ AAAA?

c a c h e . u n i v −t l n . f r I P ( 3 5 )

1 6 : 5 7 : 1 4 I P 1 0 . 1 . 6 5 . 1 . domain > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 : 56074∗ 0/1/0 ( 8 1 ) 1 6 : 5 7 : 1 4 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 > 1 0 . 1 . 6 5 . 1 . domain : 12385+ AAAA?

c a c h e . u n i v −t l n . f r . u n i v−t l n . f r I P ( 4 7 )

1 6 : 5 7 : 1 4 I P 1 0 . 1 . 6 5 . 1 . domain > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 : 12385 NXDomain∗ 0/1/0 ( 9 3 ) 1 6 : 5 7 : 1 4 I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 > 1 0 . 1 . 6 5 . 1 . domain : 64029+ A?

c a c h e . u n i v−t l n . f r I P ( 3 5 )

1 6 : 5 7 : 1 4 I P 1 0 . 1 . 6 5 . 1 . domain > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 8 0 : 64029∗ 1/1/1 A 1 0 . 1 . 6 5 I P 1 4 ( 8 6 )

1 6 : 5 7 : 1 5 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 7 8 : UDP, l e n g t h 4 1 6 : 5 7 : 1 5 I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4

(45)

tcpdump -n -X -t host ou812 and udp and not port 53

l i s t e n i n g on e t h 0 , l i n k−t y p e EN10MB ( E t h e r n e t ) , c a p t u r e s i z e 96 b y t e s I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0000 4000 4011 93 f 4 0 a02 497 f E . . . @ . @ . . . I . 0 x 0 0 1 0 : 0 a02 4956 8026 7 ab7 000 c 5 e 1 f 0000 0000 . . IV .& z . . . ˆ . . . . . 0 x 0 0 2 0 : 0000 0000 0000 0000 0000 0000 0000 . . . . I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 9 3 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0000 4000 4011 93 f 4 0 a02 4956 E . . . @ . @ . . . IV 0 x 0 0 1 0 : 0 a02 497 f 8145 8026 000 c 5391 0400 0000 . . I . . E . & . . S . . . . . I P 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0000 4000 3 f 1 1 8 d49 0 a02 512 a E . . . @ . ? . . I . . Q∗

0 x 0 0 1 0 : 0 a02 4956 8095 7 ab7 000 c 5605 0000 0000 . . IV . . z . . . V . . . . . 0 x 0 0 2 0 : 0000 0000 0000 0000 0000 0000 0000 . . . . I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 9 4 > 1 0 . 2 . 8 1 . 4 2 . 3 2 9 1 7 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0000 4000 4011 8 c 4 9 0 a02 4956 E . . . @ . @ . . I . . IV 0 x 0 0 1 0 : 0 a02 512 a 8146 8095 000 c 4 c 7 6 0300 0000 . . Q∗. F . . . . Lv . . . . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 3 0 9 3 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0001 4000 4011 93 f 3 0 a02 497 f E . . . @ . @ . . . I . 0 x 0 0 1 0 : 0 a02 4956 8026 8145 000 c 4791 1000 0000 . . IV . & . E . . G . . . . . 0 x 0 0 2 0 : 0000 0000 0000 0000 0000 0000 0000 . . . . I P 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 > 1 0 . 2 . 7 3 . 8 6 . 3 1 4 1 5 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0002 4000 4011 93 f 2 0 a02 497 f E . . . @ . @ . . . I . 0 x 0 0 1 0 : 0 a02 4956 8026 7 ab7 000 c 5 e 1 f 0000 0000 . . IV .& z . . . ˆ . . . . . 0 x 0 0 2 0 : 0000 0000 0000 0000 0000 0000 0000 . . . . I P 1 0 . 2 . 7 3 . 8 6 . 3 3 0 9 5 > 1 0 . 2 . 7 3 . 1 2 7 . 3 2 8 0 6 : UDP, l e n g t h 4

0 x 0 0 0 0 : 4500 0020 0000 4000 4011 93 f 4 0 a02 4956 E . . . @ . @ . . . IV 0 x 0 0 1 0 : 0 a02 497 f 8147 8026 000 c 558 f 0200 0000 . . I . . G . & . . U . . . . .

(46)

Code du serveur fork bas´ e sur code de retour

i n t s d c n e t ( i n t sd , i n t n )

{ i n t somme = 0 , v a l , p i d , s t a t u s ; s t r u c t s o c k a d d r aux ;

w h i l e ( n ) {

v a l = r e c v p a q u e t f r o m ( sd , &aux ) ; p i d = f o r k ( ) ;

i f ( p i d == 0 ) {

v a l = t a c h e( &aux , n ) ; c l o s e ( s d ) ;

e x i t ( v a l ) ; };

n−−;

}

w h i l e ( ( p i d = w a i t( &s t a t u s ) ) > 0 ) {

f p r i n t f ( s t d o u t , "\ nsignl du fils pid : %d", p i d ) ; somme += WEXITSTATUS( s t a t u s ) ;

}

r e t u r n somme ; }

i n t main (i n t a r g c , c h a r ∗a r g v [ ] ) { i n t sd , r e s = 0 ;

s t r u c t s o c k a d d r i n s e r v ;

i f ( ! a r g o k ( a r g c , a r g v ) ) r e t u r n 1 ; s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; i f ( s d < 0 ) e r r e u r (" socket ") ;

s e r v = s o c k a d d r i n l o c a l ( PORT ) ;

i f ( b i n d ( sd , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) < 0 ) e r r e u r (" bind ") ;

r e s = s d c n e t ( sd , NMAX ) ;

p r i n t f ("\ nSomme %d premiers carres : %d\n", NMAX, r e s ) ; f f l u s h ( s t d o u t ) ;

c l o s e ( s d ) ; r e t u r n 0 ; }

(47)

Tache du fork serveur bas´ e sur code de retour

i n t t a c h e ( s t r u c t s o c k a d d r ∗c l i e n t , i n t n ) { i n t sd , r e s ;

s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; s e n d p a q u e t t o ( sd , c l i e n t , n ) ;

r e s = r e c v p a q u e t f r o m ( sd , c l i e n t ) ; p r i n t f r o m ( c l i e n t ) ;

f p r i n t f ( s t d o u t , " dans fils %d <- %d", g e t p i d ( ) , r e s ) ; c l o s e ( s d ) ;

r e t u r n r e s ; }

(48)

Utilisation de la m´ emoire partag´ ee

x := N

X>0

X−−

job

x

f(x) attendre

processsus leger

Σ

reception

partagee memoire

processsus leger

Σ

requete

0

(49)

Tache du thread serveur

v o i d∗ t a c h e ( v o i d ∗ parms ) { i n t sd , r e s ;

a r g t a s k a r g ;

a r g = ∗( ( a r g t a s k ∗) parms ) ;

s d = s o c k e t ( AF INET , SOCK DGRAM, 0 ) ; p r i n t f r o m ( &a r g . c l i e n t ) ;

p r i n t f (" thread sub - >%d", a r g . v a l ) ; f f l u s h ( s t d o u t ) ;

s e n d p a q u e t t o ( sd , & a r g . c l i e n t , a r g . v a l ) ; r e s = r e c v p a q u e t f r o m ( sd , & a r g . c l i e n t ) ; p t h r e a d m u t e x l o c k( & mymutex ) ;

somme += r e s ; n b p r o c−−;

p t h r e a d m u t e x u n l o c k( & mymutex ) ; p t h r e a d e x i t( NULL ) ;

}

(50)

Thread serveur

v o i d s d c n e t ( i n t sd , i n t n ) { i n t r e t , v a l ;

s t r u c t t a s k a r g ; w h i l e ( n ) {

v a l = r e c v p a q u e t f r o m ( sd , & a r g . c l i e n t ) ; a r g . v a l = n ;

p t h r e a d m u t e x l o c k( & mymutex ) ; n b p r o c ++;

p r i n t f ("\ nval =% d actif =% d", n , n b p r o c ) ; p t h r e a d m u t e x u n l o c k( & mymutex ) ; n e w t h r e a d ( ) ;

r e t = p t h r e a d c r e a t e( & ( a c t i f s−>t ) , NULL , t a c h e , (v o i d ∗) & a r g ) ; i f ( r e t ) e r r e u r (" thread ") ;

n = n − 1 ; }

w h i l e ( a c t i f s ) {

p t h r e a d j o i n( a c t i f s−>t , NULL ) ; d e l t h r e a d ( ) ;

} }

(51)

Mode connect´ e

close close

socket bind listen accept

send

recev send

recev

socket CLIENT

SERVEUR

connect

(52)

Mod` ele de code serveur TCP

i n t m a s t e r , s l a v e ; s t r u c s o c k a d d r i n s e r v ; s o c k l e n t l o n g u e u r ;

m a s t e r = s o c k e t ( AF INET , SOCK STREAM , 0 ) ; i f ( m a s t e r < 0 ) e r r e u r (" socket ") ;

s e r v = s o c k a d d r i n l o c a l ( PORT ) ;

i f ( b i n d ( m a s t e r , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) < 0 ) e r r e u r (" bind ") ;

l i s t e n( m a s t e r , 5 ) ;

l o n g u e u r = s i z e o f( s t r u c t a d d r i n ) ;

(53)

Boucle du serveur TCP

w h i l e ( 1 ) {

s l a v e = a c c e p t( m a s t e r , & a d r e s s e , &l o n g u e u r ) ; i f ( s l a v e < 0 )

e r r e u r (" accept ") ; s w i t c h( f o r k ( ) ) {

c a s e 0 : /∗ f i l s ∗/

c l o s e ( m a s t e r ) ; t r a i t e m e n t ( s l a v e ) ; e x i t ( 0 ) ;

c a s e −1 :

e r r e u r ( " fork ") ; d e f a u l t : /∗ p e r e ∗/

c l o s e ( s l a v e ) ; }

r e t u r n 0 ; }

(54)

Mod` ele de code client TCP

i n t s o c k ;

s t r u c s o c k a d d r i n s e r v ; s o c k l e n t l o n g u e u r ;

s o c k = s o c k e t ( AF INET , SOCK STREAM , 0 ) ; i f ( s o c k < 0 ) e r r e u r (" socket ") ;

s e r v = s o c k a d d r i n b y n a m e ( PORT , SERV ) ;

i f ( c o n n e c t( s o c k , (s t r u c t s o c k a d d r ∗) &s e r v , s i z e o f( s e r v ) ) < 0 ) e r r e u r (" connect ") ;

w h i l e ( 1 ) {

nb = r e a d( s o c k , b f r , MAX) ; i f ( nb < 0 ) e r r e u r (" read ") ; t r a i t e m e n t ( ) ;

nb = w r i t e( s o c k , b f r , s t r l e n ( b f r ) + 1 ) ; i f ( nb < 0 ) e r r e u r (" write ") ;

}

(55)

Liens vers les sources

I socktools.h socktools.c sock.tar

I sdclient.c sdclientfork.c sdcserv.c sdcservforkexit.c sdcservforktube.c sdcservthread.c udpservmin.c whoami.c

I install.sh start.sh status.sh urls.sh

I makefile Makefile

I socket.tex urls.tex

I sdc.fig sdcfork.fig sdcproc.fig sdcthread.fig tcp.fig tube.fig udp.fig udpfork.fig zombie.fig

Références

Documents relatifs

l'arrêté royal du 23 juin 2008 modifiant l'arrêté royal du 16 juillet 1992 relatif aux registres de la population et au registre des étrangers, paru au Moniteur belge du 16

Ce guide consiste à définir les étapes les plus importantes de la recherche bibliographique dans la bibliothèque de ENSM aux étudiants et chercheurs, et expliquer de manière simple

CENTRE COMMERCIAL DES TEMPLIERS 27140 GISORS... DU PDT WILSON

EN: The Electromagnetic Compatibility Directive (EMCD) and its amending Directives – DE: Richtlinie über elektromagnetische Verträglichkeit (EMCD) und ihre Änderungsrichtlinien

313-4-2 du code de l’action sociale et des familles, les candidats peuvent solliciter des précisions complémentaires auprès de la Direction Enfance Famille, Madame Véronique

This document updates RFC 3261 to state the constraint generically and clarifies that the constraint applies to all SIP header fields where there is a choice between

Liste des participants atelier régional ville et quartier durables - 5

Justificatif employeur pour les deux parents ou le parent qui élève seul son enfant (ou copie bulletin de salaire récent) ou attestation inscription à Pôle Emploi ou entrée