Sie sind auf Seite 1von 41

Les sockets UNIX

Sylvie Dupuy sdupuy@ccr.jussieu.fr anne 2000


1

Protocoles de lInternet : rappels


 Interface du service de transport
APPLICATION send
ICMP UDP IP ARP Data Link 1 MAC 1 PHY 1 TCP ICMP IP ARP Data Link 1 Data Link 2 MAC 1 PHY 1 MAC 2 PHY 2

APPLICATION Num. port UDP ou TCP


ICMP UDP IP ARP Data Link 2 MAC 2 PHY 2

receive
TCP

Endsystem sur rseau 1

Routeur IP

Endsystem sur rseau 2

Numro de port = identifie lapplication laquelle le paquet IP est destin 2

Notion de socket (1)


 Permet dtablir un canal de communication bidirectionnel entre deux applications (plus exactement entre deux TSAPs)  Socket UDP : paquets de taille variable, transport non fiable (pertes, duplications, erreurs possibles)  Socket TCP : paquets de taille variable dlivrs dans lordre et sans erreurs => Choisir le protocole en fonction des besoins de lapplication : donnes informatiques (FTP, Telnet) : TCP, video : UDP

Notion de socket (2)


 Sous Unix les applications sont dnommes processus  Les processus actifs sont rpertories dans une table du systme et identifis par un pid (cf. commande ps)  Lorsquil est actif, un processus possde un contexte dexcution => variables denvironnement, table de descripteurs de fichiers ouverts

Notion de socket (3)


 Mcanisme de communication entre applications sous Unix : - pipe (ou tube nomm) -> fichier - mmoire partage (system V) - file de messages - sockets  Lorsquun objet de ce type est cr par une application, le systme lui alloue un identifiant. Lidentifiant dun socket est un descripteur analogue aux descripteurs de fichiers.

Fork et hritage
 Unix est un systme multitches : => un processus en cours dexcution peut se dupliquer dynamiquement : fork() => aprs un fork(), deux applications : le processus pre et le processus fils sexcutent simultanment (en temps partag ou bien en parallle sur un systme multiprocesseurs) => le processus fils hrite du contexte dexcution du processus pre

Terminaison de processus
 Le processus pre attend habituellement la terminaison du processus fils : => wait(), attente passive : reoit le signal SIGCLD (cf. table des signaux /usr/include/signal.h)  Lorsque le processus pre se termine sans avoir fait un wait (), le processus fils est rattach au processus de PID 1 (init)

Recouvrement
 Le code du processus fils peut tre dynamiquement remplac par celui dun excutable stock sur disque : => exec ()  Possibilit de passage de paramtres (ligne de commande) et des variables denvironnement  Aprs un exec() le processus conserve toutes ses caractristiques : PID, priorit, propritaire et groupe rels, catalogue courant, terminal associ, masque de cration de fichiers, descripteurs de fichiers ouverts, signaux ignors (les autres signaux reprennent leur comportement par dfaut)

Redirection des entres/sorties


 Les descripteurs de fichiers 0,1 et 2 correspondent respectivement : - lentre standard (clavier), - la sortie standard (cran), - la sortie erreur standard (cran)  Ces fichiers spciaux (mode caractre) sont ouverts par dfaut lors de la cration du processus  La primitive systme dup() permet de dupliquer un descripteur (ie. Toutes les lectures/critures effectues sur lun des fichiers le sont aussi sur lautre) => par ce mcanime, les fichiers standards peuvent tre redirigs

Modle de communication
 Un processus (le serveur) est en attente ( lcoute) sur un numro de port => tous les processus (les clients) connaissant ladresse IP du serveur et le numro de port peuvent lui envoyer des messages (requtes)  Le serveur trate les messages entrants puis renvoie une rponse au client en utilisant le numro de port source contenu dans len-tte du message  En mode connect (TCP) il y a tablissement pralable dune connexion

10

Programmation des sockets


 Les sockets sont identifis dans le systme par des descripteurs de mme nature que les descripteurs de fichiers => les fichiers dentres/sortie standard (desc. 0,1 et 2) peuvent tre redirigs sur des sockets => il y a hritage des descripteurs de sockets aprs un fork()  Le descripteur dun socket est renvoy par la primitive socket(). Le processus peut alors effectuer des oprations de lecture/criture car la communication est bidirectionnelle (!= tube)  Les frontires de messages sont conserves
11

Domaine dun socket(1)


 Domaine UNIX : AF_UNIX <sys/un.h> Les sockets sont locales au systme et fournissent un mcanisme dIPC (InterProcessus Communication) struct sockaddr_un { short sun_family; char sun_path [108] };

/* AF_UNIX */ /* rfrence UNIX */

12

Domaine dun socket(2)


 Domaine internet : AF_INET struct in_addr { u_long s_addr; }; struct sockaddr_in { short sin_family; u_short sin_port; struct sin_addr; char sin_zero[8]; };

/* AF_INET */ /* numro de port */ /* adresse internet */ /* champ de 8 zeros] */

13

Types de sockets
 SOCK_DGRAM : transport de donnes en mode non connect. Dans le domaine AF_INET, le protocole UDP est utilis. Les frontires de messages sont prserves.  SOCK_STREAM : transport de donnes en mode connect. Dans le domaine AF_INET, utilisation de TCP. Frontires de messages prserves et possibilit denvoi de messages urgents.  SOCK_RAW : permet laccs au service de niveau 3 (mission/rception de paquets IP)  SOCK_SEQPACKET : comme le type SOCK_STREAM mais ne permettant pas lenvoi de messages urgents
14

Cration dun socket


int socket (domaine, type, protocole) int domaine; /* AF_INET, */ int type; /* SOCK_DGRAM, */ int protocole; /* 0 : protocole par dfaut attribu par le systme*/  Structure de donnes associe un socket : type, domaine et protocole du socket tat (en tat de recevoir ou dmettre) adresse des buffers de rception et dmission pointeurs sur les donnes en mission/rception groupe de processus pour la gestion des signaux SIGURG, SIGIO

15

Binding : association socket/adresse


int bind (sock, p_adresse, lg) int sock; struct sockaddr *p_addresse; int lg;

/* descripteur de socket */ /* pointeur sur ladresse */ /* longueur de ladresse */

Aprs sa cration un socket est accessible par son descripteur. Seuls des processus fils peuvent en hriter. Bind fournit un procd de nommage dun socket permettant dautres processus dy accder. Cas derreurs : descripteur incorrect (EBADF,ENOTSOCK), adresse incorrecte, inaccessible ou dj utilise (EADDRNOTAVAIL, EADDRINUSE, EACCESS), socket dj associ une adresse (EINVAL).
16

Binding dans le domaine AF_INET(1)

 Dans le domaine internet, le champ sockaddr est une structure sockaddr_in => choisir une adresse internet quelconque (INADDR_ANY) ou spcifier ladresse dune interface IP (gethostname() et gethostbyname()) => choisir le numro de port (getservbyname() dans le cas dun service existant) ou bien fixer un numro non rserv (>= IPPORT_RESERVED) ou bien laisser le systme choisir un numro de port (initialiser le champ sin_port zro)

17

Binding dans le domaine AF_INET(2)


 Pour accder ladresse associe un socket en connaissant seulement son descripteur : int getsockname (sock, p_adr, p_lg) int sock; /* descripteur du socket */ struct sockaddr_in *p_addr; /* pointeur sur ladresse */ int *p_lg; /* pointeur sur la longueur de ladresse */ A lappel p_lg = sizeof(struct sockaddr_in), au retour p_lg = longueur effective de ladresse

18

Emission de datagrammes(1)
int sendto(sock, ms, lg, option, p_dest, lgdest) int sock; /* descripteur du socket */ char *msg; /* adresse du message envoyer */ int lg; /* longueur du message */ int option; /* =0 pour le type SOCK_DGRAM */ struct sockaddr *p_dest; /* pointeur sur adresse socket dest */ int lgdest; /* longueur adresse socket dest */ => retour = nombre de caractres envoys ou 1 en cas dchec (descripteur ou adresse du socket de destination invalide, taille de message ne permettant pas lenvoi dun seul datagramme)

19

Emission de datagrammes(2)
 Pour envoyer une srie de messages : int sendmsg (sock, msg, option) int sock; /* descripteur du socket en mission */ struct msghdr msg[]; /* tableau des en-ttes de messages */ int option; => cette primitive denvoi peut tre utilise sans appel pralable la primitive bind(). Le systme associe le socket une adresse lors de lenvoi du premier message.

20

Emission de datagrammes(3)
 Structure des en-ttes de messages mettre <sys/socket.h> struct msghdr { caddr_t msg_name; /* adresse optionnelle */ int msg_namelen; /* taille de ladresse */ struct iovec *msg_iov; /* tableau de messages */ int msg_iovlen; /* nombre dlements du tableau */ caddr_t msg_accrights; /* inutilis pour les sockets */ int msg_accrightslen; /* inutilis pour les sockets */ }; Structure iovec <sys/uio.h> struct iovec { caddr_t iov_base; int iov_len;

/* adresse du message */ /* longueur du message */ };


21

Rception de datagrammes (1)


int recvfrom ( sock, msg, option, p_exp, p_lgexp) int sock; /* descripteur du socket */ char *msg; /* adresse mmoire du message reu */ int lg; /* taille du buffer contenant le message */ int option; /* 0 ou MSG_PEEK*/ struct sockaddr *p_exp; /* adresse de lexpediteur */ int *p_lgexp; /* sizeof(p_exp) et longueur du rsultat */ Le paramtre lg doit correspondre la taille du message reu, sinon des caractres sont perdus (il faut connatre la taille du message envoy) Retourne le nombre de caractres reus ou 1 en cas derreur
22

Rception de datagrammes (2)


Lappel recvfrom est bloquant. Pour viter lattente de rception dun message, utiliser fcntl ( sock, F_SETFL,FNDELAY|fcntl (sock, F_GETFL,0)); Pour rpondre, le processus extrait ladresse et le numro de port de la structure sockaddr (sockaddr_in dans le domaine AF_INET); Loption MSG_PEEK permet de consulter le message sans lextraire  Pour recevoir une srie de messages : int recvmsg ( sock, msg, option) int sock; /* descripteur du socket de rception */ struct msghdr [ ]; /* tableau des en-ttes reus */ int option;
23

Communication client/serveur(1)
Sur le serveur : - crr un socket de type SOCK_DGRAM (donner un numro de port) - dtacher le serveur du terminal de lancement (pas dinterruptions clavier possibles) - boucler en attente des messages : les lire par recvfrom( ), y rpondre par sendto( ) Sur le client : - rcuprer ladresse du serveur (gethostbyname( )) - crer un socket, initialiser les champs (numro de port, adresse @IPdest) - envoyer une requte par sendto ( ), lire la rponse par recvfrom ( )
24

Communication client/serveur(2)
 Les fonctions suivantes sont utilises pour la programmation des sockets : - bzero : initialiser zro les champs dune structure sockaddr - bcopy : initialiser le champ adresse (sin_addr) dune structure sockaddr - htons : initialiser le champ port de la structure (little != big endian) Pour viter lattente active du serveur (while(1)), le service associ au numro de port choisi pour le serveur peut tre enregistr dans le fichier /etc/services. En modifiant le fichier /etc/inetd.conf, le processus daemon inetd prendra en charge la cration dun processus serveur sur rception dun message de requte contenant le numro de port du service (attente active, select, fork()). Inetd relit le fichier inetd.conf sur rception dun signal SIGHUP.

25

Communication en mode connect(1)


 Linformation est change aprs tablissement dune connexion. Contrairement lmission de datagrammes, les messages sont reus en mode flot (pas de notion de frontire de message)  Modle de communication : - le serveur est en attente dune demande de connexion sur un numro de port TCP correspondant un service via un socket. - lorsquune requte arrive le serveur reoit un signal, il cre un nouveau socket puis se duplique (fork()). - le processus fils prend en charge lchange de donnes avec le client (exec()), tandis que le processus pre retourne attendre de nouvelles demandes de connexion sur le premier socket.

26

Communication en mode connect(2)


 Primitives associes au diffrentes tapes de la communication :
Cration et attachement du socket Socket/bind

Ouverture du service listen

Attente de la demande de connexion accept

processus pre

Cration dun processus fils fork

Traitement de la demande exec processus fils 27

Listen( )
 Aprs avoir cr un socket de type SOCK_STREAM, le serveur indique au systme quil est lcoute sur un port TCP socket (AF_INET, SOCK_STREAM, 0); int listen ( sock, nb ) int sock; int nb;

/* descripteur du socket dcoute */ /* nombre maxi de connexions */

=> si le champ sin_port de la structure sockaddr_in na pas t initialis, le numro de port est attribu par le systme. Le processus utilisera getsockname() pour le connatre

28

Accept()
 Accept() permet dextraire une demande de connexion parmi lensemble des requtes en attente (FIFO)  La primitive cre un nouveau socket qui est associe un nouveau numro de port choisi par le systme et retourne son descripteur  Au retour de lappel, le champ p_adr->sin_port contient le numro de port du socket du client ayant demand louverture dune connexion int accept ( sock, p_adr, p_lgadr ) int sock; /* descripteur du socket */ struct sockaddr *p_adr; /* adresse du socket */ int *p_lgadr; /* pointeur sur la longueur de ladresse */ => sil ny a pas de requte en attente lappel est bloquant sauf si le socket est en mode non bloquant (cf. fcntl). En ce cas, la valeur de retour vaut 1 et errno = EWOULDBLOCK
29

Communication en mode connect : ct client


 Etapes dune demande dtablissement de connexion :
Cration et attachement du socket Socket/bind

Construction de ladresse du serveur

Demande de connexion connect Echec Dialogue avec le serveur 30

Connect( )
 La primitive connect() ralise ltablissement dune connexion bidirectionnelle de bout-en-bout entre le client et le serveur en associant socket serveur et socket client. int connect ( sock, p_adr, lgadr ) int sock; /* descripteur socket local */ struct sockaddr *p_adr; /* adresse socket distant */ int lgadr; /* longueur adresse distante */ => socket local et distant doivent tre de mme type et appartenir au mme domaine. => le serveur doit avoir effectu un listen() et ne pas avoir atteint la file de demandes de connexion en attente ne doit pas tre pleine.

31

Connect( ) : dlai dtablissement dune connexion


 Lorsque la file de demandes de connexions du serveur est pleine, le processus client est bloqu jusqu expiration du dlai dtablissement dune connexion. Le code de retour est alors 1 et errno = ETIMEDOUT  En mode non bloquant, le retour est immdiat mais la tentative dtablissement de connexion est maintenue : - le client peut senqurir de ltablissement de la connexion avec select( ) en passant le descripteur du socket parmi les paramtres reprsentant les descripteurs tests en criture. - sil excute nouveau un connect avant expiration du dlai dtablissement, le retour est immdiat et errno = EALREADY

32

Emission/Rception de messages TCP(1)


 Les primitives standard de lecture/criture de fichiers permettent de lire/crire dans les sockets, donc denvoyer des messages TCP int write ( sock, msg, lg ) int sock; char *msg; int lg; int read ( sock, msg, lg ) int sock; char *msg; int lg;

/* descripteur du socket local */ /* adresse du message */ /* longueur du message */

/* descripteur du socket local */ /* adresse de sauvegarde du message */ /* longueur de la zne */


33

Emission de messages TCP(2)


 La primitive send permet lenvoi de donnes urgentes (hors bande) int send (sock, msg, option) int sock; /* descripteur du socket local */ char *msg; /* adresse du message envoyer */ int lg; /* longueur du message */ int option /* 0 ou MSG_OOB */ => retourne le nombre de caractres mis la lecture est bloquante si le buffer en mission (socket local) ou le buffer en rception (socket distant) est plein fcntl( ) permet les lectures non bloquantes

34

Rception de messages TCP(3)


 La primitive recv permet dextraire des donnes urgentes et de lire des donnes sans les extraire du buffer de rception du socket int recv ( sock, msg, lg, option ) int sock; /* descripteur du socket local */ char *msg; /* adresse de sauvegarde du message */ int lg; /* longueur de la zone */ int option; /* 0 ou MSG_PEEK ou MSG_OOB */ => La lecture est par dfaut bloquante. Le paramtre lg spcifie un nombre maximal de caractres lire.

35

Terminaison dune connexion


 Au lieu dutiliser la primitive close sur le descripteur du fichier comme pour les sockets UDP, il faut utiliser la primitive shutdown qui assure le transfert des messages en attente dmission dans les buffers locaux int shutdown ( desc, sens ) int desc; /* descripteur de socket */ int sens; /* 0, 1 ou 2 */ 0 indique que le processus ne veut plus recevoir, 1 quil ne veut plus mettre et 2 ni recevoir, ni mettre si un processus tente dcrire sur un socket qui a t ferm en reception sur le site distant, il reoit le signal SIGPIPE

36

Signaux SIGIO/SIGURG
 Le signal SIGIO peut tre envoy par le systme un ou plusieurs processus lorsquun message a t reu sur un socket : - dfinir un handler du signal SIGIO (ie. fonction de traitement du signal) - demander lenvoi du signal SIGIO larrive dun caractre (fcntl(), FASYNC) - attribuer un groupe propritaire au socket (fcntl(sock), F_SETOWN, getpid())  De mme le signal SIGURG peut tre envoy un groupe de processus lors de la rception dun caractre urgent (utiliser recv et loption MSG_OOB); celui-ci est repr dans le flot de donnes par une marque

37

Paramtrage des sockets (1)


 La primitive getsockopt fournit des informations sur le paramtrage int getsockopt ( desc, niveau, option, o_arg, lg) int desc; /* descripteur de la socket */ int niveau; /* niveau de loption */ int option; /* option appliquer */ char *p_arg; /* pointeur pour rcuprer la valeur */ int *lg; /* lappel : lg rserve, au retour lg du rsultat */ => Quand les options sont dfinies au niveau de linterface des sockets, la valeur du paramtre option est SOL_SOCKET (pour que la prise en compte des options ait lieu a un autre niveau, utiliser getprotobyname())
38

Paramtrage des sockets (2)


 Modification de la valeur dune option : int setsockopt (desc, niveau, option, p_arg,lg) int desc; /* descripteur du socket */ int niveau; /* niveau de loption */ int option; /* option appliquer */ char *p_arg; /* pointeur sur largument de loption */ int lg; /* longueur de largument */

39

Paramtrage des sockets (3)


 Valeurs possibles de certaines options <sys/socket.h> SO_TYPE SO_BROADCAST SO_SNDBUF SO_RCVBUF type de la socket (getsockopt seulement) si *p_adr=1 diffusion (SOCK_DGRAM seulement) *p_adr = taille du buffer dmission *p_adr = taille du buffer de rception

40

Source

La communication sous UNIX Jean-Marie RIFFLET, dition Mc Graw Hill

41

Das könnte Ihnen auch gefallen