Exemples de Programmation R´ eseau
Philippe Langevin
Octobre 2007.
G´en´eralit´e R´esolution Mode UDP Client/Serveur Traitement d´etach´e Mode TCP
Liens
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.
Connexion
I
UDP: application orient´ ee sans connexion, mode non connect´ e.
I
TCP: application orient´ ee connexion.
Adresses
Les adresses existent sous forme de chaine de caract` eres,
mail.univ-tln.fr 127.0.0.1o` 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.
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 ; }
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.
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
hostentpour 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 addrdans le champ
h addr list[0]de la structure hostent renvoy´ ee.
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 typeAF INET.
I
Retour: Les fonctions
gethostbyname()et
gethostbyaddr()
renvoient un pointeur sur la structure
hostent , ou bien un pointeur
nullsi une erreur se produit,
auquel cas
h errnocontient le code d’erreur.
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.
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.
Mode non connect´ e
bind
recevfrom sendto
close socket
close recevfrom
sendto
socket bind
SERVEUR CLIENT
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
errnocontient le
code d’erreur.
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.
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 portd’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 ) ;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
recvfromest 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
errnoest 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.
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 ; }
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
sockaddrest plutˆ ot le difficile ` a manier,
sockaddr insp´ ecifique au socket “internet”.
I
taille identique, transtypage.
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
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 )
Un client/serveur
0 0
stop
job
result
requete reception
Σ
f(x) proc++
X−−
proc++
X>0 proc>0 proc := 0
x := N
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 ; }
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 ; }
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 ;
}
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 ; }
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 ; }
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
errnocontient le code d’erreur.
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 ; }
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 ;
}
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 ) ; }
}
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
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
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
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
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
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.
Communication interprocessus par tube
x := N
X>0
0 X−−
Σ
f(x) x
job
result
result
sous processsus
sous processsus requete
reception
Tube de communication, pipe
1: write NOYAU processsus
0: read
sous processsus
tube
Signal SIGCHILD, zombie
sous processsus processsus
NOYAU
exit, return, abort wait
signal
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 ;
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 ; }
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 ;
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
[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
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 . . . . .
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 ; }
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 ; }
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
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 ) ;
}
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 ( ) ;
} }
Mode connect´ e
close close
socket bind listen accept
send
recev send
recev
socket CLIENT
SERVEUR
connect
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 ) ;
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 ; }
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 ") ;
}
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