Beruflich Dokumente
Kultur Dokumente
receive
TCP
Routeur IP
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)
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
12
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
15
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
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
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;
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
26
processus pre
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;
=> 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
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
32
34
35
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
39
40
Source
41