12.07.2015 Views

Généralités sur les systèmes d'exploitation - Site personnel de ...

Généralités sur les systèmes d'exploitation - Site personnel de ...

Généralités sur les systèmes d'exploitation - Site personnel de ...

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

#inclu<strong>de</strong> #inclu<strong>de</strong> int listen ( int sockfd, int backlog) ;LO14 : Université Technologique <strong>de</strong> TroyesCet appel est généralement utilisé après <strong>les</strong> appels socket et bind et juste avant <strong>les</strong> appels l'appel accept.L'argument backlog spécifie le nombre <strong>de</strong> connexions à établir dans une file d'attente par le systèmelorsque le serveur exécute l'appel accept. Cet argument est généralement mis à 5 qui est la valeurmaximale utilisée.e) L'appel système accept#inclu<strong>de</strong> #inclu<strong>de</strong> int accept (int sockfd, struct sockaddr *peer , int *addrlen) ;L'argument sockfd désigne le <strong>de</strong>scripteur <strong>de</strong> socket <strong>sur</strong> lequel seront attendues <strong>les</strong> connexions. Peer est unpointeur vers une structure d'adresse <strong>de</strong> socket.Lorsqu'une requête arrive, le système enregistre l'adresse du client dans la stucture *peer et la longueur <strong>de</strong>l'adresse dans *addrlen. Il crée alors un nouveau socket connecté avec la <strong>de</strong>stination spécifiée par le client,et renvoit à l'appelant un <strong>de</strong>scripteur <strong>de</strong> socket. Les échanges futurs avec ce client se feront donc parl'intermédiaire <strong>de</strong> ce socket.Le socket initial sockfd n'a donc pas <strong>de</strong> <strong>de</strong>stination et reste ouvert pour accepter <strong>de</strong> futures <strong>de</strong>man<strong>de</strong>s.Tant qu'il n'y a pas <strong>de</strong> connexions le serveur se bloque <strong>sur</strong> cette appel. Lorsqu'une <strong>de</strong>man<strong>de</strong> <strong>de</strong> connexionarrive, l'appel système accept se termine. Le serveur peut gérer <strong>les</strong> <strong>de</strong>man<strong>de</strong>s itérativement ousimultanément :- Dans l'approche itérative, le serveur traite lui même la requête, ferme le nouveau socket puis invoque <strong>de</strong>nouveau accept pour obtenir la <strong>de</strong>man<strong>de</strong> suivante.- Dans l'approche parallèle, lorsque l'appel système accept se termine le serveur crée un serveur fils chargé<strong>de</strong> traiter la <strong>de</strong>man<strong>de</strong> (appel <strong>de</strong> fork et exec). Lorsque le fils a terminer il ferme le socket et meurt. Leserveur maître ferme quand à lui la copie du nouveau socket après avoir exécuté le fork. Il appel ensuite <strong>de</strong>nouveau accept pour obtenir la <strong>de</strong>man<strong>de</strong> suivante.Exemple <strong>de</strong> serveur itératifint sockfd, newsockfd ;if ( ( sockfd = socket (.....)) < 0 )err_sys(``erreur <strong>de</strong> socket``) ;if ( bind ( sockfd, ....) < 0 )err_sys (``erreur <strong>de</strong> bind'')if ( listen ( sockfd , 5) < 0 ) ;err_sys (`` erreur <strong>de</strong> listen'' ) ;for ( ; ; ) {newsockfd = accept ( sockfd, .....) ;if ( newsockfd < 0)err_sys( ``erreur <strong>de</strong> accept'') ;execute_la_<strong>de</strong>man<strong>de</strong>( newsockfd ) ;close ( newsockfd ) ;}Exemple <strong>de</strong> serveur à accès concurrentint sockfd, newsockfd ;if ( ( sockfd = socket (.....)) < 0 )err_sys(``erreur <strong>de</strong> socket``) ;if ( bind ( sockfd, ....) < 0 )err_sys (``erreur <strong>de</strong> bind'')if ( listen ( sockfd , 5) < 0 ) ;err_sys (`` erreur <strong>de</strong> listen'' ) ;33 /98 S. Moutou : Cours

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!