Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
0-0
Gilles Menez
Matrise Informatique
2 Berkeley Sockets 2.1 Introduction . . . . . . . . . . . . . . . . . . . 2.2 Network I O et File I O . . . . . . . . . . . . . 2.2.1 Particularit des Network I O . . . . . . es 2.3 Le concept de socket . . . . . . . . . . . . . . . 2.4 Caract erisation dune socket . . . . . . . . . . . 2.4.1 Le type dune socket . . . . . . . . . . . 2.4.2 Le domaine dune socket . . . . . . . . . 2.4.3 Stream et Datagram . . . . . . . . . . . 2.5 La structure socket . . . . . . . . . . . . . . . . 2.6 Le domaine UNIX . . . . . . . . . . . . . . . . 2.6.1 Stream et Datagram dans le domaine UNIX 2.7 Les adresses . . . . . . . . . . . . . . . . . . . 2.7.1 Adresses dans le domaine UNIX . . . . . 2.7.2 Adresses dans le domaine INTERNET . . 2.7.3 Les formats de repr esentation . . . . . . . 2.7.4 Les fonctions darrangement de formats . . 3 LAPI socket 3.1 File descriptors . . . . . . . . . . . 3.2 Creation dune socket : socket(...) . . 3.3 Suppression dune socket : close(...) 3.4 Attachement dune adresse : bind(...) 3.5 Adresses IP et Services . . . . . . 3.5.1 Resolution des adresses IP . 3.5.2 Resolution du service . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
4 La communication par datagrammes 4.1 Organisation dun client-serveur UDP . 4.2 Serveur It eratif et Serveur Concurrent 4.3 Squelette dun client-serveur UDP . . 4.4 Lenvoi dun message . . . . . . . . . 4.4.1 La primitive sendto(...) . . . . 4.4.2 La primitive sendmsg() . . . . 4.5 La r eception dun message . . . . . . 4.5.1 La primitive recvfrom() . . . . 4.5.2 La primitive recvmsg() . . . . . 4.6 La scrutation . . . . . . . . . . . . . 4.6.1 La primitive select . . . . . . . 4.7 Asynchronisme . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
Gilles Menez
Matrise Informatique
4.8 Les pseudo-connexions . . . . . . . . . . . 4.8.1 La primitive connect . . . . . . . . . . 4.8.2 Les primitives denvoi et de r eception . 4.8.3 Consultation du nom de la socket paire
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
30 30 30 31 32 33 33 34 34 35 36 37 37 37 38 38 38 40 41 42 43 43 43 44 44 44
5 La communication en mode connect e 5.1 Etablissement de la connexion . . . . . . . . . 5.1.1 Le point de vue du serveur . . . . . . . 5.1.2 Primitives de gestion de la connexion . . 5.1.3 La soustraitance du service . . . . . . 5.1.4 Le point de vue des clients . . . . . . . 5.1.5 Les primitives de gestion de la connexion 5.2 La fermeture de la connexion . . . . . . . . . . 5.2.1 La primitive close() . . . . . . . . . . . 5.2.2 La primitive shutdown() . . . . . . . . . 5.3 Le dialogue client serveur . . . . . . . . . . . 5.3.1 Ph enom` ene de d esynchronisation . . . 5.3.2 Taille de buffers et limitations . . . . . . 5.3.3 Gestion des tampons . . . . . . . . . . 5.3.4 Lenvoi de caract` eres . . . . . . . . . . 5.3.5 La r eception de caract` eres . . . . . . . 5.4 Exemples complets dapplications . . . . . . . 5.4.1 Commande d echo de petits messages . 5.4.2 Decoupage des envois . . . . . . . . . 5.5 La prise en compte de messages urgents . . . . 5.5.1 Le c e emetteur . . . . . . . . . . . . ot 5.5.2 Le c e recepteur . . . . . . . . . . . . ot
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
ii
menez@unice.fr
Matrise Informatique
Le concept de client-serveur
Gilles Menez
Matrise Informatique
` Le modele client-serveur
La majorit des applications r e eseau modernes se fondent sur le mod` client-serveur . ele Ce type de programme stocke dordinaire dinnombrables donn eees sur un serveur puissant et ou on ereux et ou sp ecialis tandis que le traitement et linterface utilisateur echoit au logiciel client e, execute sur des ordinateurs individuels aux performances nettement plus modestes.
le client comme celui qui engage la conversation et le serveur comme celui qui attend les requ etes des clients.
` A cet egard, certains programmes remplissent a la fois les fonctions de client et de serveur.
Lorsquun serveur Web Apache recoit une requ dun client Web tel que Navigator de Netscape, ete
` les informations stock dans le serveur sont exp ees au client, et a lexception de la requ ees edi ete initiale du document, l echange seffectue toujours du serveur vers le client. Les serveurs Web dot de programmes de CGI font ofce de serveurs dapplications et de chiers. es
menez@unice.fr
Matrise Informatique
/TeX/INFO/Cours_Socket/TeX.1998> netstat -a Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address tcp 0 0 *:sunrpc *:* tcp 0 0 *:ftp *:* tcp 0 0 *:telnet *:* tcp 0 0 *:gopher *:* tcp 0 0 *:shell *:* tcp 0 0 *:login *:* tcp 0 0 *:pop *:* tcp 0 0 *:imap *:* tcp 0 0 *:finger *:* tcp 0 0 *:time *:* tcp 0 0 *:2049 *:* tcp 0 0 *:printer *:* tcp 0 0 *:smtp *:* tcp 0 0 *:6000 *:* tcp 0 0 mowgli:1023 aristippe:shell tcp 0 0 mowgli:1022 aristippe:1023 tcp 0 0 mowgli:6000 aristippe:8245 tcp 1 0 mowgli:9811 www.inria.fr:www tcp 1 0 mowgli:9815 www.inria.fr:www tcp 0 0 mowgli:10296 nephtys.lip6.fr:ftp udp 0 0 *:812 *:* udp 0 0 *:syslog *:* udp 0 0 *:sunrpc *:* udp 0 0 *:talk *:* udp 0 0 *:time *:* udp 0 0 *:mount *:* udp 0 0 *:nfs *:* udp 0 0 *:netbios-ns *:* udp 0 0 *:netbios-dgm *:* udp 0 0 mowgli:netbios-ns *:* udp 0 0 mowgli:netbios-dgm *:* raw 0 0 *:1 *:*
State LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN FIN_WAIT2 ESTABLISHED ESTABLISHED CLOSE_WAIT CLOSE_WAIT ESTABLISHED
Gilles Menez
Matrise Informatique
les services quoffre la machine (LISTEN) les services dont elle est le client (ESTABLISHED)
menez@unice.fr
Matrise Informatique
Demultiplexage
Gilles Menez
Matrise Informatique
menez@unice.fr
Services et Ports
> cat /etc/services tcpmux netstat ftp-data ftp telnet whois domain domain http www login talk 1/tcp .... 15/tcp .... 20/tcp 21/tcp 23/tcp .... 43/tcp 53/tcp 53/udp .... 80/tcp 80/tcp .... 513/tcp .... 517/udp .... # rfc-1078
Matrise Informatique
nicname
# usually to sri-nic
# www is used by some broken # progs, http is more correct # BSD rlogind(8) # BSD talkd(8)
Gilles Menez
Matrise Informatique
La mise en correspondance et plus particuli` erement laffectation des num eros de ports inf erieurs
` a 1024 est effectu par lIANA (Internet Assigned Numbers Authority). ees ` Leur politique est daffecter deux protocoles a un service lorsquil lui assigne un num de port. ero Cest pourquoi la plupart des entr sont doubles m ees eme si elles nutilisent quun protocole. Un client ne se pr eoccupe g eralement pas du num de port quil utilise pour emettre ou recevoir. en ero Seule la garantie de lunicit du num de port est important pour lui. e ero em ` Les num eros de ports des clients sont appel ports eph eres . Ceci parce quun client ne es ` peut exister quaussi longtemps quun utilisateur a besoin de son service, alors que les serveurs fonctionnent tant que la machine est op erationnelle.
menez@unice.fr
Les sockets
Matrise Informatique
Les sockets constituent une des nombreuses APIs (Application Program Interfaces) des protocoles de communication. ` La disponibilit de ces interfaces d e epend a la fois du ` systeme dexploitation et du langage de programmation utilise. Les deux APIs majeures du monde UNIX sont les Berkeley Sockets et la System V Transport Layer ` Interface TLI etendue a XTI. Ces deux interfaces sont ecrites en langage C.
Gilles Menez
Matrise Informatique
Berkeley Sockets
2.1 Introduction
Les sockets constituent une des nombreuses APIs (Application Program Interfaces) des protocoles de communication. ` La disponibilit de ces interfaces d e epend a la fois du syst` eme dexploitation et du langage de programmation utilis e. Les deux APIs majeures du monde UNIX sont les Berkeley Sockets et la System V Transport ` Layer Interface TLI etendue a XTI. Ces deux interfaces sont ecrites en langage C.
menez@unice.fr
Non-symetrie de la relation client-serveur La connexion reseau peut etre connection-oriented ou connectionless. Une association est denie par :
Matrise Informatique
Stream et Message ` Linterface doit permettre dacc eder a differents type de protocoles (TCP, UDP, XNS,
....)
Gilles Menez
Matrise Informatique
Non-sym etrie de la relation client-serveur : Par exemple, dans le cas dune communication connection-oriented, il y a celui qui provoque la ` connection et celui qui la g` ere. On verra que le comportement vis a vis des extr es de communiemit cation est un peu diff erente suivant quon est serveur ou client. La connexion r eseau peut etre connection-oriented ou connectionless : ` Dans le premier cas, on sapparente a une entr sortie de type chier. On doit ouvrir une connexion ee (comme on ouvre un chier) et la communication a toujours lieu sur le ce lien. Dans le second cas, il ny a pas dopen, la m eme op eration peut cibler diff erents processus peer (i.e. il a plusieurs destinataires possibles). Une connexion r eseau est d enie par : (protocol,local-addr,local-process,foreign-addr,foreign-process) Exemple : (tcp , 128.10.0.3 , 1500 , 128.10.0.7 , 21) Il y a plus de param` etres quun le-descriptor. Pour certains protocoles, la taille des enregistrements peut avoir une grande importance, cest la ` notion de stream et ou de message. Les entr ees sorties sur chier sont assimilables a des streams .... on se moque de taille des paquets. (cf [?] page 115) ` Linterface doit permettre dacc eder a differents type de protocoles (TCP, UDP, XNS, ....). Il ny a pas de protocole dacc aux chiers. es
menez@unice.fr
Le concept de socket
PROCESSUS PROCESSUS
Matrise Informatique
SOCKET
SOCKET
1
Niveau IP
Son domaine
Gilles Menez
Matrise Informatique
Nom Symbolique Caracteristiques Principales ` socket orientee vers lechange de datagrammes a un niveau bas de protocole ( IP par exemple ) SOCK DRAM socket orientee vers la transmission de datagrammes structur es en mode nonconnect e avec une abilit e minimale SOCK STREAM socket orientee vers lechange de s equences continues de ` carcteres, generalement en mode connect e avec garantie du maximum de abilit e SOCK RDM socket orientee vers lechange de datagrammes en mode non connecte en garantissant un maximum de abilit e SOCK SEQPACKET socket orientee vers lechange de datagrammes en mode connecte en garantissant un maximum de abilit e SOCK RAW
Matrise Informatique
menez@unice.fr
Nom symbolique domaine local format des adresses sockaddr un (include AF INET internet
Matrise Informatique
AF UNIX
sockaddr in (include
AF NS
XEROX NS
sockaddr ns (include
menez@unice.fr
Gilles Menez
Matrise Informatique
Il determine la s emantique des communications quelle permet de r ealiser. A un type de socket est associ un ensemble de propri es : e et abilit e, sequencement, etablisssement dune connexion, ... Les differents type de socket gurent dans 2.4.2 Le domaine dune socket
Une socket est identi localement au processus par un descripteur. ee Cette identication est locale. ` An que les autres processus puissent la nommer, il faut pouvoir lui attribuer une adresse a usage externe. Le domaine dune socket d enit le format des adresses possibles et lensemble des sockets avec lesquelles la socket pourra communiquer. Il denit egalement une famille de protocoles utilisables. Un certain nombre de domaines sont r epertori dans es
menez@unice.fr
Matrise Informatique
Stream et Datagram
LAPI socket met en oeuvre deux formes de communications classiques : La notion de stream sousentend un ot dinformations non interpr ees. et La notion de datagram est associ a un service ee ` de type connectionless. La combinaison, domaine-type, choisie pour la socket, induit un protocole de communication.
AF UNIX AF INET AF NS Yes Yes TCP UDP IP SPP IDP Yes SPP
10
Gilles Menez
Matrise Informatique
2.4.3
Stream et Datagram
LAPI socket met en oeuvre deux modes de communications classiques : 1. La notion de stream sousentend un dinformations non interpr ees. ot et Il ny a pas de constitution denregistrement (et par cons equent pas de notion de record boundaries. Elle assure, de plus une transmission able et ordonn ee. 2. La notion de datagram est associ a un service de type connectionless. ee ` ` Les messages ou encore datagrams sont transmis ind ependamment dun syst` eme a lautre. Cette ind ependance suppose que chaque message contient toutes les informations n ecessaires ` a sa livraison. Ce type de transport nest pas able et lordre d emission des paquets nest pas n ecessairement celui des rec eption. Les int ets majeurs de ce mode sont la rapidit er ` e et la mise en oeuvre plus souple dapplications multicast. Toutes les combinaisons (domaine,types) ne sont pas permises. La gure qui suit montre les combinaisons valides ainsi que les protocoles s electionn par la paire. es type \ domaine SOCK SOCK SOCK SOCK STREAM DGRAM RAW SEQPACKET AF UNIX Yes Yes AF INET TCP UDP IP AF NS SPP IDP Yes SPP
menez@unice.fr
Matrise Informatique
Objet socket
/* <sys/socketvar.h> : Kernel structure per socket. Contains send and receive buffer queues, handle on protocol and pointer to protocol private data and error information. */ struct socket { short so_type; /* type de la socket, voir socket.h */ short so_options; /* options dutilisation, voir socket.h */ short so_linger; /* duree de persistante apres fermeture */ short so_state; /* etat interne */ caddr_t so_pcb; /* bloc de controle du protocol */ struct protosw *so_proto; /* descripteur du protocole */ struct socket *so_head; /* ptr de chainage arriere */ struct socket *so_q0; /* ptr sur connexions en cours detablissement */ struct socket *so_q; /* ptr sur connexions etablies pendantes */ short so_q0len; /* nombre de connexions partielle */ short so_qlen; /* nombre de connexions pendantes */ short so_qlimit; /* nombre maximal de connexions pendantes */ short so_timeo; /* temporisation pour connexions */ u_short so_error; /* erreur au cours de connexion */ short so_pgrp; /* groupe de process pour gestion de signaux */ struct sockbuf { /* tampon de reception et demission */ u_long sb_cc; /* actual chars in buffer */ u_long sb_hiwat; /* max actual char count */ u_long sb_mbcnt; /* chars of mbufs used */ u_long sb_mbmax; /* max chars of mbufs to use */ u_long sb_lowat; /* low water mark (not used yet) */ struct mbuf *sb_mb; /* the mbuf chain */ struct proc *sb_sel; /* process selecting read/write */ short sb_timeo; /* timeout (not used yet) */ short sb_flags; /* flags, see below */ } so_rcv, so_snd; struct wupalt *so_wupalt;
};
UNSA-24 mars 2000
11
Gilles Menez
Matrise Informatique
10
menez@unice.fr
Processus Requte denvoi message Systme dexploitation Requte de rception message Processus
Domaine Unix
Matrise Informatique
Gilles Menez
Matrise Informatique
On est dans ce cas en pr esence dune communication inter-processus r esidant sur la m eme machine. Le sch ema g eral de la communication locale de deux processus ne partageant pas de donn en ees communes dans leur espace dadressage, et sollicitant donc pour communiquer les services du syst` eme dexploitation auxquels ils appartiennent, est le suivant :
Processus
message
De tels echanges dinformations impliquent donc une double recopie des donn a transmettre : ees ` ` 1. une premi` correspondant a un envoi, de lespace dadressage de l ere emetteur vers le noyau, ` 2. une seconde, correspondant a la reception, du noyau vers lespace dadressage du r ecepteur. ` Ce schema sapplique a la communication au travers de chiers, de tubes, de les de messages et de sockets du domaine UNIX. Les sockets locales (UNIX) ont comme avantage par rapport aux tubes, la possi bilite des communications bidirectionnelles, donc full-duplex. Par contre, cette communication est plus lente que les tubes (cf [?] page 289) 2.6.1 Stream et Datagram dans le domaine UNIX
` Le systeme UNIX fournit une interface connection-oriented et une interface connectionless. Les deux sont sures puisquelles ne mettent pas en oeuvre de m edia et quheureusement le kernel ne simule pas les pertes potentielles dune ligne. Elles ne n ecessitent donc pas de checksums et pas dencapsulation. La difference principale r eside dans le controle de ux. Lapproche connectionless ne d eveloppe aucun controle de ux : il est possible pour un client denvoyer si vite ses donn quil provoquera une ees ` famine sur le buffer a lemission ? ? ? ([?] page 263). Il est donc conseill dutiliser linterface connection-oriented. e
11
Gilles Menez
Matrise Informatique
Processus
INTERNET
Numro de descripteur
Adresse
Par contre pour dialoguer avec une socket sur une autre machine ou m eme pour que les autres machines puissent dialoguer avec la socket, le descripteur ne suft pas ! ` Il faut que lon attribut un nom a la socket. Ce nom sera son identicateur pour le reste du monde L adresse dune socket cest son nom !
12
menez@unice.fr
Matrise Informatique
/* Definitions for UNIX IPC domain. */ #include <sys/un.h> struct sockaddr_un { short sun_family; /* domaine = AF_UNIX */ char sun_path[108]; /* reference */ };
dou dans le code, les lignes : `
struct sockaddr_un addrserv; /*Adresse Unix*/ /* RAZ de ladresse Unix */ memset(&addrserv, 0, sizeof(addrserv)); /* Initialisation de ladresse Unix */ addrserv.sun_family = AF_UNIX; strcpy(addrserv.sun_path,"./s.scr");
13
Gilles Menez
Matrise Informatique
2.7.1
Adresses dans le domaine UNIX Dans le domaine UNIX, le nom prend la forme dun nom de chier qui sert de lieu dechange.
` Lattachement de ladresse a la socket ne peut se faire que si la r erence correspondante (i.e. le ef ` chier) nexiste pas d a. ej La suppression de la r erence associ a une socket est r ef ee ` ealis ee
13
menez@unice.fr
Matrise Informatique
# include
netinet / in . h
/ /
struct
u long s addr ; / ;
Un e n t i e r long
/ / / /
10
struct /
11
12
short /
13
14
15
16
struct i n a d d r s i n a d d r ; /
17
inutilises
18
char ;
19
i n t fds ;
F i l e d e s c r i p t o r de l a socket
Son adresse
/ /
14
Gilles Menez
Matrise Informatique
2.7.2
Le format de ladresse dune socket connue au niveau Internet est diff erent de celui au format Unix.. Ladresse comporte : Un num de port (sin port) : ero Une adresse Internet (sin addr) : Numero de port : ` Lattachement dune socket a un numero de port particulier est essentiel pour permettre aux clients dun service particulier de contacter le serveur correspondant (surtout si celui-ci est bien connu ... cf le chier /etc/services). Par contre, dans le cas dun client, la socket peut etre attach a un port de num (libre !) ee ` ero quelconque. Outre les ports bien connus, car attribu a des services biens connus, il est possible de laisser le es ` ` systeme choisir le port : 1. En identiant le port comme le port de num 0, ero 2. En utilisant la fonction getsockname( ... ). ` Si un processus ayant cr e une socket commence a emettre sur celle-ci des informations, sans avoir au e ` prealable r ealis lattachement de la socket, le syst` e eme proc` edera automatiquement a un rattachement sur un port quelconque. Lutilisation de cette facilit fait quil est possible pour un processus de poss e eder une socket attach a ee ` une adresse quil ne connat pas. Il peut alors demander au syst` eme de lui fournir cette adresse par un ` appel a la fonction getsockname( ... ). Adresse Internet (sin addr) :
` La valeur INADDR ANY de sin addr.s addr permet dassocier a la socket toute les adresses possibles de la machine. Utile si la machine est une passerelle, la socket peut etre connect sur les diff ee erents r eseaux auxquels la machine est connect ee. Sur une machine quelconque, lutilisation de cette valeur permet de faire l economie de la recherche de ladresse de la machine locale
14
menez@unice.fr
Matrise Informatique
Recapitulatifs
IPv6 struct sockaddr_in6{} length AF_INET 16-bit port# 32-bit flow label UNIX struct sockaddr_un{} length AF_LOCAL
struct sockaddr_in{}
variable length
15
menez@unice.fr
Matrise Informatique
Numeros de port
Services Port/Proto. 21 tcp 23 tcp 69 udp 79 tcp ... File Transfert Protocol Virtual Terminal Protocol Trivial File Transfert Protocol Finger ...
Par contre, dans le cas dun client, la socket peut etre ` attachee a un port de num (libre !) quelconque. ero Espaces des ports ports reserves ports assignes automatiquement 1024-5000 3000-65535 Internet 1-1023 XNS 1-2999
16
menez@unice.fr
Matrise Informatique
Le probl` eme est que la repr esentation dun entier long est d ependant machine : #IP 132.227.70.77 132.227.70.77 Valeur Binaire 84 C3 46 4D 4D 46 C3 84 Format Endian Big (standard) Little
1. Dans le cas Big Endian : loctet de poids fort est stock a ladresse A et loctet de poids e` ` faible est socke a ladresse A+3. Ce format suit celui de l ecriture. 2. Dans le cas Little Endian :
loctet de poids fort est stock a ladresse A+3 et loctet de poids e` ` faible est socke a ladresse A.
17
menez@unice.fr
tout nombre occupant plus dun octet : Numero de port Adresse Internet Les fonctions hton et ntoh permettent de d enir un standard r eseau :
Matrise Informatique
htonl() ou htons() : host to network HOST NETWORK ntohl() ou ntohs() : network to host
18
Gilles Menez
Matrise Informatique
2.7.3
Ladresse dune machine Internet est repr esentee, en IPv4, par un entier long (32 bits) non sign e.
1 2 3 4 5
Un e n t i e r long
La notation point est obtenue en convertissant en base 10 chaque octet formant le nombre. Cest ee ladresse point ee :
0x #IP
01 1 .
02 2 .
FF 255 .
04 4
Le probl` eme est que la repr esentation dun entier long est d ependant machine : #IP 132.227.70.77 132.227.70.77 1. Dans le cas Big Endian : loctet de poids fort est stock a ladresse A et loctet de poids faible est sock a ladresse A+3. Ce e` e` format suit celui de l ecriture. 2. Dans le cas Little Endian : loctet de poids fort est stock a ladresse A+3 et loctet de poids faible est sock a ladresse A. e` e` 2.7.4 Les fonctions darrangement de formats Valeur Binaire 84 C3 46 4D 4D 46 C3 84 Format Endian Big (standard) Little
Lid pour faire communiquer des machines utilisant potentiellement des standards de repr ee, esentation des nombres diff erents, est de d enir un standard r eseau (en fait big endian ) et de pr evoir sur chaque syst` eme des fonctions dacc au standard r es eseau : Prototypes :
1 2 3 4 5 6 7
/ Pour l e s adresses I n t e r n e t u long h t o n l ( u long ) u long n t o h l ( u long ) / Pour l e s numeros de p o r t s u s h o r t htons ( u s h o r t ) u s h o r t ntohs ( u s h o r t )
..................
...................
On the i80x86 the host byte order is Least Signicant Byte rst(Little Endian), whereas the
network byte order, as used on the Internet, is Most Signicant Byte rst (Big Endian). (cf )
Sur SUN (Big Endian) les fonctions sont des macros nulles (cf
).
15
menez@unice.fr
Primitives de manipulation
1
Matrise Informatique
# include # include
/ . . . Creation d une socket i n t socket ( i n t domaine , i n t type , int protocol ) ; / . . . Fermeture d une socket i n t close ( i n t fd ) ; / . . . Attachement d une adresse i n t bind ( i n t sockfd , s t r u c t sockaddr i n t addrlen ) ;
10
11
12
13
14
myaddr ,
15
19
Gilles Menez
Matrise Informatique
LAPI socket
La manipulation des sockets n essite un nombre restreint de primitives. ec
` Lappel read tente de lire nbytes octets de donn ees a partir de lobjet r erenc par le le ef e descriptor fd. Les octets lus sont plac dans le buffer point par buf. es e Lappel write effectue une ecriture sur le le descriptor des octets pr esents dans le buffer point par buf. e Les Entr ees Sorties Unix sont des doctets. ots
# include # include
` Le param` etre domain specie un domaine de communication a lint erieur duquel la communication prend place ; ceci s electionne la famille de procotole qui va etre utilis ee. Ces familles sont denies dans sys/socket.h. Les formats courants sont : AF UNIX (UNIX internal protocols) AF INET (ARPA Internet protocols) AF ISO (ISO protocols) AF NS (Xerox Network Systems protocols) AF IMPLINK (IMP host at IMP link layer) Le type indiqu specie la semantique de la communication : Les types courants sont : e SOCK STREAM SOCK DGRAM SOCK RAW SOCK SEQPACKET SOCK RDM Largument protocol vaut typiquement 0 (le syst` eme choisi). On peut toutefois lutiliser pour sp ecier certains protocoles sp ecialis es( cf /etc/protocols ).
16
Gilles Menez
Matrise Informatique
La difference majeure avec le open() qui permet la cr eation dun descripteur de chier et louverture dune socket, cest que dans le cadre du open(), le syst` eme ` un chier ou un p dexploitation associe un descripteur de chier a eriph erique ` bien precis, alors quil peut cr des sockets sans les associer a une adresse de eer destination sp ecique. Lapplication peut donc choisir : ` de mentionner a chaque ecriture ou lecture la destination (approche connectionless) ` ou dassocier (approche connection-oriented) la socket a une adresse sp ecique pour ne pas ` avoir a la r eter systematiquement. ep
# include # include
i n t close ( i n t fd ) ;
Une socket est supprim a la r ee ` ealisation effective de la fermeture du dernier descripteur permettant dy acceder.
# include # include
myaddr ,
Dans le prototype de la fonction : La structure sockaddr est g erique : en 1. On lui substituera sockaddr un dans le domaine AF UNIX. 2. On lui substituera sockaddr in dans le domaine AF INET. addrlen est suppos etre la taille en octet de ladresse. e
17
menez@unice.fr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
Matrise Informatique
Exemple
Fonction de c r e a t i o n et d attachement d une socket INTERNET. 1er parametre : type de l a socket ( SOCK STREAM ou SOCK DGRAM)
2eme parametre : un p o i n t e u r sur un e n t i e r ( numero de p o r t ) 3eme parametre : un p o i n t e u r sur s o c k a d d r i n La socket sera a t t a c h e a l adresse machine IADDR ANY
s t a t i c s t r u c t s o c k a d d r i n adresse ;
i n t c r e e r s o c k e t ( i n t type , i n t i n t desc ; /
d e s c r i p t e u r de l a socket
p adresse ) /
i n t longueur = sizeof ( s t r u c t s o c k a d d r i n ) ; / /
1 ) C r e a t i o n de l a socket
taille
de l adresse
1)
p e r r o r ( C r e a t i o n de socket i m p o s s i b l e ) ; return
1;
2 ) P r e p a r a t i o n de l adresse d attachement
/ /
1)
1);
fermeture de l a socket
/ / /
i f ( p adresse ! = NULL)
return desc ;
p adresse se r e m p l i t a p a r t i r de desc
20
menez@unice.fr
Matrise Informatique
Exemple
Programme p r i n c i p a l
associe a c r e e r s o c k e t . c
10
11
12
# include c r e e r s o c k e t . c main ( )
Je sais . . . . .
13
14
15
struct s o c k a d d r i n adresse udp , adresse tcp ; int port udp , port tcp ; i n t socket udp , s o c k e t t c p ;
16
17
18
19
port udp = 2467; i f ( ( socket udp = c r e e r s o c k e t ( SOCK DGRAM, & p o r t u d p , & adresse udp ))!= p r i n t f ( Socket UDP attachee au p o r t : % d n , ntohs ( adresse udp . s i n p o r t ) ) ;
20
21
1)
22
23
24
port tcp = 0; i f ( ( s o c k e t t c p = c r e e r s o c k e t ( SOCK STREAM, & p o r t t c p , & adresse tcp ))!= p r i n t f ( Socket TCP attachee au p o r t : % d n , ntohs ( adresse tcp . s i n p o r t ) ) ;
25
26
1)
27
29 30
28
sleep ( 6 0 ) ;
21
Gilles Menez
Matrise Informatique
Cela suppose de connatre son adresse IP et ou le service que lon veut atteindre.
Dans les deux cas, on a vu quil existait une approche nominative de ces param` etres. ` Comme on peut difcilement demander a un programmeur de connatre les translations : entre tous les services et leurs num eros de ports entre tous les noms de machines et leurs num eros IP Il existe des fonctions que lon peut utiliser pour obtenir ces informations. ` gethostbyname() permet dobtenir les adresses IP dune machine a partir de son nom.
18
menez@unice.fr
Matrise Informatique
comme
h name ; h a l i a s e s ;
h addrtype ;
# include
netdb . h
struct hostent
# include
sys / socket . h
struct hostent
6 7
22
Gilles Menez
Matrise Informatique
3.5.1
Les fonctions gethostbyname(3) et gethostbyaddr(3) retournent un pointeur sur un objet dont la structure est :
1 2 3 4 5 6 7 8 9 10 11
# include
netdb . h
h name ; / o f f i c i a l name of host / h a l i a s e s ; / a l i a s l i s t / h addrtype ; / host address type / h length ; / l e n g t h of address / h a d d r l i s t ; / l i s t of addresses /
h addr list [0] /
# define h addr
f o r backward c o m p a t i b i l i t y
Les membres de la structure hostent sont : h name : The ofcial name of the host. h aliases : A zero-terminated array of alternative names for the host. h addrtype : The type of address ; always AF INET at present. h length : The length of the address in bytes. h addr list : A zero-terminated array of network addresses for the host in network byte order. h addr : The rst address in h addr list for backward compatibility. ` eros IP correspondants a toutes les interfaces de la maLa structure h addr list est une list de num chines sur Internet. La fonction gethostbyaddr() retourne une structure de hostent pour la machine dadresse addr de longueur len et de type type .
i n t tcpopen ( char
service ,
char
host )
19
menez@unice.fr
Resolution du service
La structure servent est d enie dans
1
Matrise Informatique
comme suit :
s name ; s a l i a s e s ;
s port ;
/ o f f i c i a l / alias
s e r v i c e name
s proto ;
/ / p o r t number / / p r o t o c o l to use /
list
# include
netdb . h
struct servent
getservbyname ( const char name, const char p r o t o ) ; getservbyport ( int port , const char p r o t o ) ;
struct servent
23
Gilles Menez
Matrise Informatique
3.5.2
Resolution du service
Un peu de la m eme facon, les fonctions getservbyname(3) et getservbyport(3) retournent un pointeur sur un objet renseign a partir des champs du chier /etc/services. e ` Ceci en ne fournissant quun morceau dinformation : nom ou port.
1 2 3 4 5 6 7 8
# include
netdb . h
s name ; s a l i a s e s ;
s port ; s proto ;
/ / / /
Les membres de la structure servent sont : s name : The ofcial name of the service. s aliases : A zero terminated list of alternative names for the service. s port : The port number for the service given in network byte order. s proto : The name of the protocol to use with this service. La phase de connexion est g eralement pr ee par la translation dun nom de service en num en efac ero de port :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
i n t tcpopen ( char
service ,
char
host )
struct s o c k a d d r i n sin ; struct hostent hp ; struct s e r v t e n t sp ; ... i f ( ( sp=getservbyname ( s e r v i c e , tcp )) == NULL) error . . . i f ( ( hp=gethostbyname ( host ) ) = = NULL) error . . . ... bzero ( ( char )& s i n . s i n a d d r , hp h l e n g t h ) ; s i n . s i n f a m i l y = AF INET ; bcopy ( hp h addr , ( char )& s i n . s i n a d d r , hp h l e n g t h ) ; s i n . s i n p o r t = sp s p o r t ; ...
20
menez@unice.fr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
Matrise Informatique
Exemple
P r i n t the h o s t e n t i n f o r m a t i o n f o r every host whose name i s s p e c i f i e d on the command l i n e . Issu de chez Stevens . . .
for s t r u c t hostent /
Return a s t r i n g c o n t a i n i n g some a d d i t i o n a l i n f o r m a t i o n a f t e r a host name or address lookup e r r o r gethostbyname ( ) or g e t h o s t b y a ddr ( ) . / int h errno ; / host e r r o r number / int h nerr ; / # of e r r o r message s t r i n g s / extern const char h e r r l i s t [ ] ; / the e r r o r message t a b l e / host
err str () msgstr [ 2 0 0 ] ; s t a t i c char
char
0;
return ( msgstr ) ;
/ /
main ( argc , argv ) int char r e g i s t e r char char
argv ; p t r ; h o s t
err str ();
argc ;
h o s t p t r ;
our l i b
function
47 48 49 50 51 52
46
ptr =
argc 0) ++ argv ;
ptr , host err str ( ) ) ;
24
menez@unice.fr
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
Matrise Informatique
printf ( of ficial /
host name: %s n , h o s t p t r
h name ) ;
go
through the l i s t
h a l i a s e s ++;
of a l i a s e s / ( h o s t p t r h a l i a s e s ) ) a l i a s : %sn , p t r ) ;
! = NULL)
hostptr
h addrtype , h
hostptr
h length );
h addrtype )
addr list , hostptr
h length );
of I n t e r n e t addresses , i n d o t t e d decimal n o t a t i o n .
p r i n e t ( l i s t p t r , length ) length ;
l i s t p t r ; p t r ;
I n t e r n e t address : %s n , i n e t n t o a ( p t r ) ) ;
while ( ( p t r = ( s t r u c t i n a d d r printf (
) l i s t p t r + + ) ! = NULL)
25
menez@unice.fr
Matrise Informatique
gethostbyaddr()
main ( )
s;
long i p = 0 x863B036F ; /
10
11
ipa . s addr = i p ;
12
13
s = gethostbyaddr ( ( char p r i n t f ( %s n , s
14
h name ) ;
15
26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 int int char char / /
menez@unice.fr
Matrise Informatique
if ( port
e i t h e r s e r v i c e or p o r t ) ;
63 64 65 66 67
t c p s r v a d d r . s i n p o r t = htons ( p o r t ) ;
should be in
n e t i n e t / in . h
68 69 70 71 72
First
Only i f /
The f o l l o w i n g g l o b a l s are a v a i l a b l e
to the c a l l e r , i f
desired .
73 74
bcopy ( ( char
i t s dotted decimal
tcp open ( host , s e r v i c e , p o r t ) host ; service ; / / / port ; / / / int unsigned long char struct servent struct hostent /
r e t u r n socket d e s c r i p t o r
name or dotted decimal addr of other system name of s e r v i c e being requested can be NULL, i f f if if port 0 / i f = = 0 , nothing s p e c i a l
75 / 76 77 else
1 on e r r o r
78 / 79 80 81 82 83
return (
use p o r t # of s e r v i c e /
0, bind a l o c a l reserved p o r t
84
85 / 86 87 88 89 90 91 92 93 94 else i f ( p o r t if ( port = 0)
hp
host , h o s t e r r s t r ( ) ) ; 1);
hp ;
found i t
by name , s t r u c t u r e copy
fd , r e s v p o r t ;
2 /
0)
0)
Initialize
We l l
s t o r e the a c t u a l 4
95 96 97 98
r e s v p o r t = IPPORT RESERVED
1; 0)
i f ( ( fd = r r e s v p o r t (& r e s v p o r t ))
byte p o r t # below .
bzero ( ( char
t c p s r v a d d r . s i n f a m i l y = AF INET ; i f ( s e r v i c e ! = NULL) i f ( ( sp = getservbyname( s e r v i c e , tcp ) ) = = NULL) e r r r e t ( tcp open : unknown s e r v i c e : %s / tcp , s e r v i c e ) ; return ( 1); sp ; /
52 53 54 55 56 57 58
s t r u c t u r e copy
s port ; / s e r v i c e s value
113 / 114
return ( fd ) ;
a l l OK
27
menez@unice.fr
Matrise Informatique
La notion de datagram est associ a un service de type ee ` connectionless : Les messages ou encore datagrams sont transmis ` independamment dun syst` eme a lautre. Cette ind ependance suppose que chaque message contient ` toutes les informations n ecessaires a sa livraison. Un processus souhaitant communiquer avec le monde ext erieur par lintermediaire dune socket de ce type doit donc r ealiser, selon les circonstances, un certain nombre des op erations suivantes :
28
Gilles Menez
Matrise Informatique
` Cette partie est consacr a letude des m ee ` ecanismes relatifs a la communication de processus par linterm ediaire de sockets de type SOCK DGRAM . La notion de datagram est associ a un service de type connectionless ee ` ` Les messages ou encore datagrams sont transmis ind ependamment dun syst` eme a lautre.
Cette ind ependance suppose que chaque message contient toutes les informations n ecessaires
` a sa livraison. Il est important de se rappeler que si le domaine utilis est AF INET, la communication sappuie donc e sur le protocole UDP : ` Il ny a donc pas de service permettant a lemetteur de savoir si son message est arriv a destination, e` ` un m Dans le cas denvois successifs de messages a eme destinaire, lemetteur nest pas assur e que ses messages seront d es dans le bon ordre, elivr ` Cest donc a lapplication de mettre en place ces m ecanismes si elle souhaite en disposer (d elais de garde, acquittements, r emissions, ...). e
21
menez@unice.fr
Matrise Informatique
bind()
sendto()
29
Gilles Menez
Matrise Informatique
22
menez@unice.fr
Matrise Informatique
Serveur It eratif :
Il traite les requ etes sequentiellement : Cest le serveur qui recoit les requ etes et qui les traite. Cest un mode, une architecture, bien adapt aux services qui e ` peuvent sexecuter rapidement et correspondent a un sch ema question r eponse. Cest le cas de la plupart des serveurs d evelopp avec des es sockets du type SOCK DGRAM.
Serveur Concurrent :
Ce mode de fonctionnement est plus adapt au mode connect e e quon retrouve avec les sockets de type SOCK STREAM. Dans ce cas, plusieurs processus de service travaillent de ` maniere concurrente (parall` sur les nouvelles machines ele
SS20 ou DEC).
30
Gilles Menez
Matrise Informatique
23
1 / 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
menez@unice.fr
Matrise Informatique
P e t i t e m a n i p u l a t i o n des sockets : Permet une connexion DGRAM, INET . Les deux processus d i s t a n t s s e n v o i e n t un nombre qu i l s successivement . L un compte en p a i r , l a u t r e en i m p a i r . . .
54 55
adr0 . s i n p o r t /
reseau
i n c r e m e n t e n t 56
57 58 59
3 ) Demande d attachement
c l o s e ( sd0 ) ; exit (2); / /
/
# include # include # include # include # include # include # include # include stdio . h stdlib . h unistd . h errno . h sys / types . h sys / socket . h n e t i n e t / in . h netdb . h
/ ) ( padr0 ) , l s 0 ) == 1)
socket t e r m i n e anormalement . /
p e r r o r ( Attachement de l a socket i m p o s s i b l e ) ;
60 61 62 63 64 65 66 67
Fermeture de l a Le processus se
4)
) padr0 ,& l s 0 ) ;
argv [ ] )
E x t r e m i t e de communication
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
= / Socket
/ i n t sd0 ; / D e s c r i p t e u r / i n t ps0 = 5 0 0 1 ; / Port / s t r u c t s o c k a d d r i n adr0 ; / Adresse / s t r u c t s o c k a d d r i n padr0 = & adr0 ; i n t l s 0 = s i z e o f ( s t r u c t s o c k a d d r i n ) ; / T a i l l e de l adresse / / a r a c t e r i s a t i o n de l e x t r e m i t e d i s t a n t e C / s t r u c t s o c k a d d r i n adr1 ; / Adresse du d e s t i n a t a i r e / s t r u c t s o c k a d d r i n padr1 = & adr1 ; i n t l s 1 = s i z e o f ( s t r u c t s o c k a d d r i n ) ; / T a i l l e de l adresse / s t r u c t h o s t e n t hp1 ; / Adresse IP de l a machine d i s t a n t e /
s t r u c t s o c k a d d r i n adr2 ; struct sockaddr in
6)
l on e s t l e s e r v e u r ou l e c l i e n t for ( ; ; ) int i ;
selon que
84 85 86 87 88 89 90 91 92
peer n ) ; /
93 94 95 96
1)
97 98 99 100
1)
) ; n sendto ( sd0 , msg out , s i z e o f ( msg out ) , 0 , ( s t r u c t sockaddr ) padr1 , l s 1 ) ; p r i n t f ( Envoi t e r m i n e : %s ! n , msg out ) ; p r i n t f ( . . . en a t t e n t e de r e c e p t i o n . . . n ) ; / Toujours b l o q u a n t sur Sun et t o u j o u r s non b l o q u a n t sur Linux / recvfrom ( sd0 , msg in , s i z e o f ( msg in ) , 0 , ( s t r u c t sockaddr ) padr2 , &l s 2 ) ; / i l f a u t que l s 2 s o i t renseigne avant ! / f p r i n t f ( s t d o u t , machine % n , i n e t n t o a ( adr2 . s i n a d d r ) ) ; s p r i n t f ( Reception terminee : % s ! n , msg in ) ;
printf ( n i = a t o i ( msg in ) ; i = ( i +1)%100; s p r i n t f ( msg out , %d , i ) ; sleep ( 1 ) ;
2)
adr0 . s i n f a m i l y
/ / Format
reseau
104 105
31
Gilles Menez
Matrise Informatique
24
menez@unice.fr
Matrise Informatique
# include # include
buff ,
i n t nbytes ,
/ s t r u c t sockaddr to ,
int toaddrlen ) ;
int flags , / 0
10
La primitive sendmsg() :
1
# include # include
6 7
msg ,
32
Gilles Menez
Matrise Informatique
` ` Un appel a la fonction sendto( ... ) correspond a la demande denvoi, via la socket identi locaee ` lement par le descripteur sockfd, du message buff de longueur nbytes a la destination de la socket dont ladresse est point par to et est de longueur toaddrlen. ee
1 2 3 4 5 6 7 8 9 10
# include # include
i n t sendto ( i n t sockfd , char b u f f , i n t nbytes , int flags , / 0 / struct sockaddr to , int toaddrlen ) ;
La valeur de retour est, en cas de r eussite, le nombre de caract` eres effectivement envoy es. Parmi les erreurs eventuelles g erees par la fonction, pr en ecisons que : lerreur EMSGSIZE correspond au fait que le message est trop long pour permettre la garantie dun envoi atomique (un paquet) et ` EWOULDBLOCK correspond, en mode nonbloquant, a la saturation des tampons d emission qui entranerait en mode bloquant la suspension (temporaire) du processus emetteur. Dans le cas du domaine AF UNIX : le syst` eme est en mesure de v erier si la r erence destinaef trice existe (si elle nexiste pas, une erreur ENOENT est renvoy et, si elle existe, cest quil y a ee) actuellement une socket qui lui est associ (dans le cas contraire lerreur ECONNREFUSED est ee signal ee). Dans le cas du domaine AF INET : plus aucune erreur sur le site distant nest signal Les mesee. ` sages envoy doivent etre de taille inf es erieure a 9000. 4.4.2 La primitive sendmsg()
Cette primitive permet denvoyer un message dont le contenu est constitu de fragments non contigus e en m emoire. Les differents fragments constituant le message sont rassembl avant envoi. es ees et Dans le domaine AF UNIX, la primitive permet par ailleurs lenvoi de donn interpr ees : ainsi il est ` possible de transmettre a un processus un descripteur, lui permettant den obtenir un synonyme (cest ` a dire un descripteur pointant sur la m eme entr dans la table des chiers ouverts que le descripteur ee transmis)
25
menez@unice.fr
La primitive recvfrom() :
1
Matrise Informatique
# include # include
buff , /
from ,
10
fromaddrle n
11
La primitive recvmsg() :
1
int int
recvmsg ( s,
s t r u c t msghdr
msg,
4 5
unsigned i n t f l a g s );
33
Gilles Menez
Matrise Informatique
` Un appel a cette primitive permet de lire sur la socket identi par le descripteur sockfd un mesee sage buff de longueur nbytes. Le message extrait est mis dans le tampon de r eception de la socket. ` Dans le cas ou le message recu est de longueur sup ` erieure a lespace r eserve (le sendto( .. ) utilise un buffer de taille diff erente), le message sera tronqu e. Si le pointeur from est non nul, il est rempli avec ladresse de la source du message. Idem pour fromaddrlen qui, avant lappel contenait la taille de ladresse, recoit la taille exacte de ladresse from.
1 2 3 4 5 6 7 8 9 10 11
# include # include
i n t recvfrom ( i n t sockfd , char b u f f , i n t nbytes , i n t f l a g s , / 0 ou MSG PEEK struct sockaddr from , int fromaddrlen );
Le param` etre ags peut avoir la valeur MSG PEEK et dans ce cas, sil y a un message dans le tampon de lecture de la socket, il est recopi a ladresse de buff, mais il nest pas extrait. Le e ` ` prochain appel a la primitive portera exactement sur le m eme message. ` La primitive est bloquante, sauf demande contraire, si le tampon est vide ... enn ca reste a voir ... differences avec Linux. Elle renvoie le nombre de caract` eres recopi dans le buffer. es En cas derreur, elle renvoie la valeur (0 dans le cas dune lecture nonbloquante avec ags O NDELAY).
4.5.2
La primitive recvmsg()
` Un appel a cette fonction permet de r ecup erer, sous forme de fragments, un message recu sur la socket speciee
26
menez@unice.fr
Mecanismes de scrutation
correspondantes nonbloquante (primitives fctnl et ioctl ;
Matrise Informatique
).
` Cela conduit le processus a une attente active (scrutation it erative des points) qui est peu satisfaisante. Les distributions BSD ont introduit la primitive select qui permet au processus appelant de se mettre en attente de pouvoir r ealiser certaines op erations (bloquantes) sur des ensembles de descripteurs particuliers. Les versions SYSTEM V proposent avec le concept de stream la primitive poll encore plus exible.
34
Gilles Menez
Matrise Informatique
4.6 La scrutation
Dans un certain nombre de situations, un m eme processus est susceptible, au cours de son ex ecution, de lire des donn en diff ees erents points (sockets) sans suivre un ordre de parcours pr eni. ed
Si la lecture en ces points est bloquante (cas dun terminal, dun tube, dune socket et de mani` ere
erale dune t de stream), une lecture sur un point ou aucune donn nest pr gen ete ` ee esente peut provoquer le blocage du processus . ` On rencontre une telle situation par exemple si on souhaite d evelopper un multi-serveur UDP, cest a dire un processus capable de recevoir des messages sur diff erentes sockets de type SOCK DGRAM dans un ordre al eatoire ou encore dans limplantation dune application de connexion distante (type rlogin ou telnet) ou un processus est amen a lire al ` e ` eatoirement sur un terminal ou une socket. ` Ce que nous venons de dire sapplique tout aussi bien a lop eration d ecriture qui sav` tout aussi ere bloquante. ` Une premi` solution, consiste a rendre les op ere erations correspondantes nonbloquante (primitives ` fctnl et ioctl ; ). Cela conduit le processus a une attente active (scrutation it erative des points) qui est peu satisfaisante. Les distributions BSD ont introduit la primitive select qui permet au processus appelant de se mettre en attente de pouvoir r ealiser certaines op erations (bloquantes) sur des ensembles de descripteurs particuliers. Les versions SYSTEM V proposent avec le concept de stream la primitive poll encore plus exible.
27
menez@unice.fr
Matrise Informatique
La primitive select()
Prototype de la macro FD ZERO(fd set *ptr set) FD CLR(int desc, fd set *ptr set) FD SET(int desc, fd set *ptr set) FD ISSET(int desc, fd set *ptr set)
Effet *ptr set=0 *ptr set= *ptr set - desc *ptr set= *ptr set valeur non nulle si desc *ptr set desc
La primitive select() :
1
# include # include
7 8 9
35
Gilles Menez
Matrise Informatique
4.6.1
La primitive select
1. Les ensembles de descripteurs : Le type fd set pr eni dans ed permet de d enir des ensembles de descripteurs utilisables comme param` etres de la primitive select. Prototype de la macro FD FD FD FD ZERO(fd set *ptr set) CLR(int desc, fd set *ptr set) SET(int desc, fd set *ptr set) ISSET(int desc, fd set *ptr set) effet *ptr set=0 *ptr set= *ptr set - desc *ptr set= *ptr set desc valeur non nulle desc
*ptr set
` 2. Un appel a la fonction :
1 2 3 4 5 6 7 8 9 10
# include sys / types . h # include sys / time . h int select ( s i z e t nb desc , / n i s the h i g h e s t numbered d e s c r i p t o r i n any of the three sets , plus 1 . fd set ptr lecture , fd set ptr ecriture , fd set ptr exception , const struct t i m e v a l ptr temporisation ; );
permet de r ealiser le multiplexage par un m eme processus dop erations synchrones (i.e. bloquantes) de diff erentes natures sur des ensembles particuliers de descripteurs. Un processus appelant la primitive est bloqu jusqu` ce que lune des conditions suivantes se e a realise : lun des evenements attendus sur un descripteur de lun des ensembles se produit (lecture, ecriture, test de condition), le temps dattente maximum sest ecoul e, un signal capt par le processus est survenu. e
28
menez@unice.fr
Matrise Informatique
i n t main ( void ) fd set rfds ; struct timeval tv ; int retval ; / Watch s t d i n ( fd 0 ) to see when i t has i n p u t . FD ZERO(& r f d s ) ; FD SET ( 0 , & r f d s ) ; / Wait up to f i v e seconds . tv . tv sec = 5 ; tv . tv usec = 0 ; r e t v a l = s e l e c t ( 1 , & r f d s , NULL , NULL, & t v ) ; / Don t r e l y on the value of t v now ! if ( retval ) p r i n t f ( Data i s a v a i l a b l e now. n ) ; / FD ISSET ( 0 , & r f d s ) w i l l be t r u e . else p r i n t f ( No data w i t h i n f i v e seconds . n ) ; exit (0);
10
11
12
13
14
15
16
17
18
19
20
21
22
23
25
24
36
menez@unice.fr
Asynchronisme
Les op erations de lecture sur une socket sont, sauf demande contraire bloquantes.
Matrise Informatique
Nous venons de voir une solution au probl` eme de scrutation : la primitive select Cependant, cette op eration reste bloquante. Le processus ne peut rien faire pendant quil attend. Il est possible dactiver un m ecanisme qui provoquera lenvoi dun message SIGIO lorsquune lecture deviendra possible sur un descripteur particulier.
37
Gilles Menez
Matrise Informatique
4.7 Asynchronisme
Les op erations de lecture sur une socket sont, sauf demande contraire bloquantes. Nous venons de voir une solution au probl` eme de scrutation : la primitive select. Cependant, cette op eration reste bloquante.
On peut coupler ce m ecanisme avec la primitive select pour savoir lequel peut permettre une
lecture ` coup sur. a
29
menez@unice.fr
1 2 3 4 1
Matrise Informatique
ptr adresse ,
ptr ,
nb cararcteres ,
size t
int option );
s s i z e t recv ( i n t d e s c r i p t e u r , void
ptr ,
nb cararcteres ,
size t
10
int option );
11
2 3 4
ptr adresse ,
ptr longueur
38
Gilles Menez
Matrise Informatique
` Un appel a la fonction :
1 2 3 4 5
` permet dassocier la socket locale identi par descripteur a la socket dadresse ptr adresse. ee ` Tout nouvel appel a la primitive annule la demande pr edente et en particulier si le param` ec etre ptr adresse a la valeur NULL, la socket nest plus associ a aucune autre. ee ` 4.8.2 Les primitives denvoi et de r eception
Il est important de noter quune socket, une fois pseudo connect a une autre ne permet plus ee ` ` demettre de messages vers une socket diff erente de celle a laquelle elle a ete pseudoconnect (si ee necessaire, il faut rompre la connexion). 1. Envoi de message : La destination des messages etant implicite, il est possible dutiliser linterface standard write pour realiser les envois ou linterface sp ecique aux sockets (pseudo)connect : es
1 2 3 4 5 6
s s i z e t send ( int descripteur , void p t r , s i z e t nb caracteres , int option / I n u t i l e car SOCK DGRAM + INET );
2. Reception de message : Le message ne peut venir que de la socket paire ; dans le cas contraire un erreur sera signal ee. Linterface standard read pourra etre utilis et, sagissant dun point de communication en mode ee, ` datagramme, un appel a cette fonction provoquera lextraction du message complet. On pourra lui pr erer linterface sp ef ecique recv.
1 2 3 4 5 6
sans e x t r a i r e
30
Gilles Menez
Matrise Informatique
4.8.3
` Un appel a la primitive :
1 2 3
en cas d echec.
permet de r ecup erer ladresse de la socket associ au travers de la pseudoconnexion. Elle rend ee
31
menez@unice.fr
Cest le mode de communication associ aux sockets de type e SOCK STREAM. ` Il permet a des applications r eparties de s echanger des sequences de caract` eres continues et non structur en ees messages.
Matrise Informatique
Avec les sockets de type SOCK STREAM, et la communication en mode connect la dissymetrie entre le client et le serveur est e, clairement marquee au niveau de l etablissement de la connexion.
fermeture de la connexion.
39
Gilles Menez
Matrise Informatique
Cest le mode de communication associ aux sockets de type SOCK STREAM. e ` Il permet a des applications r eparties de s echanger des s equences de caract` eres continues et non structurees en messages. ` Etant donn que la communication s e etale sur une dur qui peut etre assez longue et donne lieu a ee un volume d echange de caract` eres susceptible d etre important, une connexion (un circuit virtuel) est etablie entre les deux entit es. Dans le cas du domaine AF INET, le protocole utilis est TCP. e La communication est able. etrique dans la mesure ou les ` Le mode de communication par message (SOCK DGRAM) est sym ` points de transport sont tous dans le m eme etat et peuvent a tout instant prendre linitiative de commencer ` un echange dinformations.Ceci, m eme si, larchitecture clientserveur tend a imposer qui sera le premier ` a entamer le dialogue : le client. Avec les sockets de type SOCK STREAM, et la communication en mode connect la dissym e, etrie entre le client et le serveur est clairement marqu ee au niveau de l etablissement de la connexion.
Lune des entit le serveur, est en attente passive de demande de connexion qui lui adressera es,
une entit en position de client qui prendra donc linitiative de la demande de connexion. e Apr cette phase initiale, on retrouve la sym es etrie dans la communication : chacune des deux extr es emit peut envoyer et recevoir des caract` eres et peut prendre linitiative de demander la fermeture de la connexion.
32
menez@unice.fr
Matrise Informatique
listen()
accept()
40
Gilles Menez
Matrise Informatique
Schema g eral dun serveur TCP : en Un serveur a un r passif dans l ole etablissement de la connexion : apr avoir avis (par un appel es e ` a la primitive listen()) le syst` eme auquel il appartient quil est pr a accepter les demandes de et ` connexion des clients, le serveur se met en attente de connexion . Pour cela, il dispose dune socket d ecoute attach au port correspondant au service et donc ee connu des clients. ` Lorsquune demande de connexion arrive a lentit TCP du syst` e eme ou sex ` ecute le serveur, le ` systeme cr une nouvelle socket d ee a cette nouvelle connexion et que lon appelle socket de ee edi ` service . Cest par ce moyen quil est possible de multiplexer temporellement sur la m eme socket plusieurs connexions. ` Le processus serveur prend connaissance de lexistence dune nouvelle connexion par un appela la primitive accept(). Au retour de cet appel, le processus recoit un descripteur lui permettant dacc eder ` a cette socket de service . Ce sch ema de fonctionnement fait apparatre un certain d ephasage entre lacceptation des connexions au niveau du protocole TCP et la connaissance de celles nonencore prises en compte par le processus luim eme. Les connexions accept au niveau TCP mais non encore prises en compte par le processus sont ees dites pendantes. Une connexion TCP est identi par un 4uple : ee (adresse host 1 , port host 1 , adresse host 2 , port host 2) Apr avoir accept une connexion, le serveur se d es e echarge en g eral du dialogue proprement dit en sur un processus ls. Linteret (voire la n ecessite) dune telle strat egie est de pouvoir prendre rapidement en compte les nouvelles demandes de connexion qui auraient d a ete accept ej ` ees au niveau TCP, et par l` de servir a, plusieurs clients le plus rapidement possible.
33
menez@unice.fr
La primitive listen(...)
1
Matrise Informatique
/ /
La primitive accept(...)
1
/ / /
ptr adresse ,
ptr lg adresse
41
Gilles Menez
Matrise Informatique
5.1.2
La primitive listen(...)
` Elle permet a un processus de d eclarer un service ouvert aupr de son syst` es eme local.
1 2 3 4
int
/ /
);
` La valeur maximale du param` etre nb pendantes correspond a la constante SOMAXCONN enie dans le chier standard . pred Normalement la socket d ecoute doit avoir ete attach au pr ee ealable. La primitive accept(...) : ` Elle permet a un processus de prendre connaissance de lexistence dune nouvelle connexion. Cette connexion est extraite de la liste des connexions pendantes et un descripteur sur une so ee ` cket dedi a cette nouvelle connexion est renvoy : cest ce nouveau descripteur qui permettra e didentier localement la connexion (4-uple associ e).
1 2 3 4 5
i n t accept ( int descripteur , / de l a socket d ecoute struct sockaddr p t r a d r e s s e , / du c l i e n t connecte int ptr lg adresse / T a i l l e de l adresse du c l i e n t );
/ / /
La socket dont le descripteur est renvoy permet donc denvoyer et de recevoir des caract` e eres sur la connexion : elle ne permet pas daccepter de nouvelles connexions.
Il est cependant possible de la rendre nonbloquante par des techniques usuelles. On peut aussi tester lexistence de connexion pendantes au moyen de la primitive select().
5.1.3 La soustraitance du service
Apr acceptation dune connexion, le serveur a deux possibilit iteration ou concurrence : es es ou bien prendre en charge la gestion du dialogue avec le client : cela peut induire une saturation au niveau des connexions pendantes et l echec de demandes de connexion de clients. ` un processus ls le dialogue. Ce qui permet le traitement concurrent de plu ou bien soustraiter a sieurs connexions. Si la gestion du dialogue est con a un processus ls, il est n essaire de pr ee ` ec evoir la prise en compte de sa termisaison qui aura lieu lorsque la connexion sera ferm faute de quoi ce processus ee, deviendra zombi et le restera.
34
1 / 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 / / / /
menez@unice.fr
Matrise Informatique
Lancement d un s e r v e u r t c p : Syntaxe d appel : s e r v e u r u d p p o r t e x e c u t a b l e stdio . h stdlib . h unistd . h errno . h signal . h sys / types . h sys / socket . h n e t i n e t / in . h # include # include # include # include # include # include # include # include
44 45 46 47 48 49 50 51 52 53 54 55
Creation
/ i m p o s s i b l e n ) ;
1)
Declaration
d o u v e r t u r e du s e r v i c e
i f ( l i s t e n ( s o c k e t e c o u t e ,10)== perror ( l i s t e n );
1)
p port , struct
sockaddr in
Boucle
/
d a t t e n t e de connexion
/ /
n ) ;
61 62 63 64
argv [ ] )
65 66 67 68 69 70 71 72
s t r u c t s o c k a d d r i n adresse ;
Reception
d un s i g n a l ( probablement SIGCHLD)
Test Test
du nombre de parametres .
/ /
i f ( argc ! = 3 )
73 74 75 76 77 78 79 80 81
f p r i n t f ( s t d e r r , Nombre de parametres i n c o r r e c t s n ) ; e x i t ( 2 ) ; d e x i s t e n c e de l e x e c u t a b l e
Lancement du processus de s e r v i c e / i f ( fork ()==0) / i l n u t i l i s e pas l a socket d ecoute / close ( socket ecoute ) ; / r e d i r e c t i o n de l e n t r e e standard sur s o c k e t s e r v i c e /
dup2 ( s o c k e t s e r v i c e , STDIN FILENO ) ; close ( socket service ) ; execlp ( argv [ 2 ] , argv [ 2 ] , NULL ) ; p e r r o r ( execlp ) ; exit (2);
i f ( access ( argv [ 2 ] , X OK ) ! = 0 )
f p r i n t f ( s t d e r r , F i c h i e r %s non e x e c u t a b l e n , argv [ 2 ] ) ; e x i t ( 2 ) ;
Detachement Attachement
du t e r m i n a l
/ n , g e t p i d ( ) ) ; s i g n a l SIGCHLD /
82 83 84 85
Le
serveur p r i n c i p a l n u t i l i s e
pas de s o c k e t s e r v i c e
42
menez@unice.fr
Matrise Informatique
43
Gilles Menez
Matrise Informatique
5.1.4
Schema g eral dun client TCP : en Le client est lentit active dans le processus d e etablissement dune connexion avec un serveur : cest lui qui en prend linitiative. Cette demande est r ealis par la primitive connect(). ee ` Attention ! ! ! ca ressemble a une pseudoconnexion mais cest tr different. es ` Lappel de la primitive donne lieu a un echange de messages avec lentit TCP du syst` e eme avec lequel la connexion est souhait ee.
35
menez@unice.fr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
Matrise Informatique
Processus
de lancement d un c l i e n t TCP
p port , struct /
sockaddr in
p adresse ) ;
argv [ ] )
pour l adresse de l a machine d i s t a n t e
p o r t d ecoute du s e r v e u r
hp ; /
/ / / 1)
i f ( argc
f p r i n t f ( s t d e r r , Nombre de parametres i n c o r r e c t s n ) ; e x i t ( 2 ) ; /
Recherche
de l adresse I n t e r n e t de l a machine du s e r v e u r
exit (2);
P r e p a r a t i o n de l adresse du s e r v e u r
/ h addr , hp h l e n g t h ) ; 1)
Demande de
exit (2);
connexion au s e r v e u r
p r i n t f ( Connexion eaccepte n ) ;
appel de l a f o n c t i o n s p e c i f i q u e au s e r v i c e
c l i e n t s e r v i c e ( s o c k e t c l i e n t , argc
3,argv + 3 ) ;
44
menez@unice.fr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Matrise Informatique
#include #include
# define TRUE 1 char ch [ 1 2 8 ] ; void c l i e n t s e r v i c e ( i n t sock , i n t argc , char int n; while ( TRUE) p r i n t f ( Chaine lue : ) ; i f ( f g e t s ( ch , 1 2 8 , s t d i n )== NULL) close ( sock ) ; e x i t (0); w r i t e ( sock , ch , s t r l e n ( ch ) ) ; memset ( ch , 0 , 1 2 8 ) ; read ( sock , ch , 1 2 8 ) ; memset ( ch , 0 , 1 2 8 ) ; p r i n t f ( Chaine recue : % s n , ch ) ;
argv [ ] )
45
Gilles Menez
Matrise Informatique
5.1.5
La demande de connexion : la primitive connect() Initiation dune connexion entre deux sockets de type SOCK STREAM. Elle induit la cr eation dun circuit virtuel permettant des echanges bidirectionnels.
1 2 3 4
` Si un appel a la primitive bind() na pas ete fait avant la demande de connexion, un attachement sur un port quelconque sera automatiquement r ealis a lappel de connect() e ` ` ` Contrairement a ce qui se passait dans le cas dune demande de pseudoconnexion, lappel a la fonction connect() est ici bloquant : le processus est bloqu jusqu` ce que la n e a egociation entre les deux entit TCP concern soit achev ( On peut rendre cet appel non bloquant) es ees ee. La demande de connexion r eussit, et donc la primitive renvoie la valeur 0, si les conditions suivantes sont realis : ees 1. les param` etres sont localement corrects ; 2. il existe une socket de type SOCK STREAM attach a ladresse *ptr adresse (et donc dans ee ` ` le meme domaine que la socket de descripteur sp e) et cette socket est a letat LISTEN ; eci 3. la socket locale nest pas d a connect ; ej ` ee 4. la socket dadresse *ptr adresse nest actuellement utilis dans une autre connexion ee 5. la le des connexions pendantes de la socket distante nest pas pleine. Dans le cas ou lune des quatre premi` ` eres conditions nest pas remplie, la fonction renvoie la valeur et la variable errno indique la nature de lerreur rencontr ee. Si la derni` condition nest pas remplie, le comportement de la primitive est particulier : ere
1. si la socket locale est en mode bloquant, le processus est bloqu La demande de connexion e. est iteree pendant un certain temps : si au bout de ce laps de temps, la connexion na pu etre etablie, la demande est abandonn (errno = ETIMEDOUT). ee 2. si la socket locale est en mode nonbloquant, le retour est imm ediat avec la valeur , la variable errno ayant la valeur EINPROGRESS. La demande de connexion continue, elle est automatiquement r etee pendant le m ep eme laps de temps que le mode bloquant. Pour prendre connaissance du fait que la connexion a pu etre etablie, le processus pourra utiliser la primitive ` select(). On ne peut pas refaire de demande de connexion a la m eme socket locale avant que le laps de temps soit ecoul e.
36
menez@unice.fr
Fermeture de la connexion
La primitive close()
1
Matrise Informatique
i n t close ( i n t d e s c r i p t e u r ) ;
La primitive shutdown()
1
# include
sys / i o c t l . h
i n t shutdown ( i n t d e s c r i p t e u r , i n t sens / 0 , 1 ou 2 );
46
Gilles Menez
Matrise Informatique
Lappel de primitive close() sur le dernier descripteur dune socket entrane sa fermeture.
1
i n t close ( i n t d e s c r i p t e u r ) ;
ees Dans le cas dune socket (SOCK STREAM, AF INET), sil existe encore des donn dans le tampon demission de la socket, le syst` eme continu dessayer de les acheminer avant de lib erer compl` etement les ressources correspondantes. ` Il est possible de rendre bloquant dans ce cas a la fonction close() 5.2.2 La primitive shutdown()
Elle permet de rendre compte, au niveau de la fermeture dune connexion, de laspect full-duplex de la communication possible via une connexion entre 2 sockets.
1 2 3 4 5 6
# include
sys / i o c t l . h
Le param` etre sens d etermine le niveau de fermeture de la connexion souhait : e ` ` sens = 0 : la socket naccepte plus dop eration de lecture. Un appel a read() ou a recv() renverra la valeur 0 ; ` sens = 1 : la socket naccepte plus les demandes denvoi de caract` eres : tout appel a write() ou send() provoquera la g eration dun exemplaire du signal SIGPIPE et, sil est capt une valeur en e, de retour -1 ; sens = 2 : la socket naccepte plus ni lecture, ni ecriture.
37
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
menez@unice.fr
Matrise Informatique
char buf [ 2 0 ] ;
main () i n t rep ; w r i t e ( STDIN FILENO , a b c d e f g h i j k l m n o , 1 5 ) ; / Envoi read ( STDIN FILENO , buf , 5 ) ; shutdown ( STDIN FILENO , 2 ) ; rep =read ( STDIN FILENO , buf , 5 ) ; p r i n t f ( rep=%dn , rep ) ; sleep ( 2 0 ) ; / Reception
/ / / /
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
argv [ ] )
/ /
23 24 25 26
22
47
menez@unice.fr
m m p1 , ... , pn <= m pn
Matrise Informatique
p2 Emission m
p3 Reception p1
p4
48
Gilles Menez
Matrise Informatique
ecoupage en messages Une difference essentielle avec les sockets de type SOCK DGRAM est que le d identiables, correspondant aux diff erents envois, nest pas pr eserve sur la socket destinatrice.
Cela signie quune op eration de lecture sur une socket peut fournir une suite de caract` eres extraite dune suite transmise par une seule op eration ou obtenue en composant des chanes trans mises successivement. Dans le cas du domaine AF INET, le protocole sousjacent (TCP) garantit que les caract` eres seront dans ` lordre de leur envoi (le protocole se r le bon ordre par rapport a eservant le droit de d ecouper un envoi). Il est donc essentiel de ne jamais oublier que la synchronisation dune op eration demission dun certain nombre de caract` eres avec une op eration de lecture de ce meme nombre de caract` eres ne fait pas partie des qualit de service offertes. es
Ainsi, si un processus r ealise une s erie de n envois de s equences de m caract` eres chacune et
un autre (le destinataire) une s equence de n lectures dau plus m caract` eres (car le protocole decoupe diff eremment), la situation qui suit est possible :
Emission m m m m m
p1
p2
p3
p4
pn
Il y a certaines limites qui affectent la taille des datagrammes IP : La taille maximum dun datagramme IPv4 est 65535 octets (header compris). Beaucoup de r eseaux ont un MTU ( maximum transmission unit ) qui peut etre dict par des e contraintes physiques. Pour Ethernet le MTU est de 1500 octets. Le MTU minimum pour Ipv4 est 68 octets. Le plus petit MTU sur le chemin entre deux h otes est appel le path MTU . e Compte tenu du fait que le routage nest pas sym etrique, le path MTU nest pas forc ement le meme dans les deux sens. Lorsquun datagramme IP va etre envoy par une interface, si la taille du datagramme exc` e ede celle du MTU du lien sur lequel se trouve linterface, alors il y a fragmentation . Les fragments ne sont jamais r e-assembl avant la destination nale. es IPv4 d enit un minimum reassembly buffer size . Il sagit de la taille de datagramme minimum support par limpl ee ementation. Pour Ipv4, cest 576 octets.
38
Gilles Menez
Matrise Informatique
TCP utilise un MSS ( maximum segment size ) qui permet au correspondant (i.e le peer) de specier (dannoncer) une taille maximale de segment. Lobjectif du correspondant est dindiquer son minimum reassembly buffer size et dessayer deviter de fragmenter. Le MSS est g eralement le MTU moins les tailles xes des ent en etes IP et TCP. Sur Ethernet cela sera 1440 (en tenant compte de lent IP(20 octets) et de lent TCP(20 ete ete octets).
39
menez@unice.fr
Tampon rception Entit TCP SOCKET lecture caractre urgent caractre urgent criture Tampon mission Rseau Entit Physique TCP SOCKET Tampon mission Tampon rception
APPLICATION KERNEL KERNEL APPLICATION
Gilles Menez
Matrise Informatique
5.3.3
Une bonne compr ehension de la gestion des buffers permet dexpliciter le ph enom` de d ene e-synchronisation. ` Les points importants a comprendre dans le fonctionnement de linterface sont : ` a chaque socket est associ deux tampons (r e eception et emission), ces tampons sont lus et ecrits de facon concurrente par la socket (application) et lentit TCP (kernel) e (en UDP cest pareil) :
sauf indication contraire, l ecriture y est bloquante si le tampon est plein. Quand lapplication appelle write, le kernel copie les donn de lapplication dans le tamees
` pon a lemission. Si il ny a pas assez de place, le processus est endormi et on sort de lappel la copie (dans le tampon) est achev ee. TCP decoupe ses envois selon loption MSS.
write quand
Lentit TCP est charg de cette r e ee egulation : si le tampon de lecture de lune des extr es est emit
plein, lentit TCP paire cesse de transmettre (ce qui risque de conduire au remplissage du tampon e decriture de la socket correspondante). La taille des diff erents tampons peut etre modi (cf setsockopt()) ee Il est possible dadresser depuis lune des extr es un caract` dit urgent ou hors bande (Out emit ere Of Band Data). Ce caract` ere, memoris du cot du recepteur ne passe pas par les tampons (sauf demande explie e cite) : ceci impose une demande de lecture explicite.
40
menez@unice.fr
Matrise Informatique
ssize t
ptr ,
nb caracteres
size t );
La primitive send() :
1
s s i z e t send ( i n t d e s c r i p t e u r , void
ptr ,
nb caracteres ,
size t
int option );
50
Gilles Menez
Matrise Informatique
5.3.4
ssize t
` ` Un tel appel correspond a la demande denvoi sur la socket des nb caract` eres lus a ladresse ptr.
Le param` etre option a : ` 1. soit la valeur 0 (seule valeur possible en AF UNIX) ce qui equivaut a ne pas utiliser doption, 2. soit la valeur MSG OOB dans le domaine AF INET qui indique que les donn a transmettre ees ` ont un caract` urgent. ere
La fonction renvoie le nombre de caract` transmis. eres Par ailleurs, si le tampon d emission de la socket est plein, le processus appelant est, sauf
demande contraire, bloqu e. ` Dans le cas ou la connexion a ete fermee, on se trouve dans une situation identique a celle de ` lecriture dans un tube sans lecteur : le processus emetteur recoit le signal SIGPIPE qui entrane normalement sa terminaison.
41
menez@unice.fr
La primitive read()
1
Matrise Informatique
ptr ,
nb caracteres
size t );
La primitive recv()
1
ptr ,
nb caracteres ,
size t
int option );
51
Gilles Menez
Matrise Informatique
5.3.5
` Un tel appel correspond a la demande de lecture sur la socket dau plus taille caract` eres qui ` seront ecrits en m emoire a ladresse ptr.
Lutilisation de cette fonction permet dexploiter les fonctionnalit offertes : lire une donn urgente es ee ou consulter les donn sans les extraire. ees Le param` etre option a : ` 1. soit la valeur 0 (seule valeur possible en AF UNIX) ce qui equivaut a ne pas utiliser doption, 2. soit la valeur MSG OOB dans le domaine AF INET pour lire une donn urgente, ee eception. 3. soit la valeur MSG PEEK pour consulter sans extraire du tampon de r
42
Gilles Menez
Matrise Informatique
, le client it` ere la s equence suivante jusqu` rena Dans cet exemple, on utilise linterface contrer la n de chier sur son entr standard. ee lire une chane dau plus 128 caract` eres sur son entr standard, ee envoyer la chane lue au serveur, attendre le retour de la chane. ` Lorsque la n de chier est d etectee, le client demande la fermeture de la connexion (par un appel a close()). Le serveur, dont lentr standard est redirig sur la socket, it` jusqu` ce quil d ee ee ere a etecte la fermeture de connexion (retour de read()) la lecture dune s equence dau plus 128 caract` eres ; ` la r eexp edition de la chane quil a lue a son exp editeur. A la sortie de la boucle, le processus de service se termine.
5.4.2
Il sagit dune simple commande d echo, variation de lexemple pr edent, ou le client proc` a lenvoi ec ` ede ` ` unique dun gros tableau de caract` eres (de taille 4096) par un seul appel a send() et attend que le serveur le lui renvoie. De son c e, le serveur r ot ealise un recv() unique dans un tampon de taille 4096 et renvoie ce quil a recu.
43
Gilles Menez
Matrise Informatique
On a vu que la demande denvoi de caract` urgent est r ere ealisable au moyen de la primitive send() avec lindicateur MSG OOB. ` Dans le cas ou une suite de caract` de longueur sup ` ere erieure a 1 est donn en param` ee etre, seul le dernier caract` est consid e comme urgent. ere er Il est necessaire que tous les caract` eres pr edents logiquement le caract` urgent aient ete transec ere ` mis avant que celuici puisse l etre a son tour. Il est par exemple possible, si le contr de ux a signal que le tampon de r ole e eception est plein, que des caract` eres pr edant logiquement le caract` urgent naient pas encore pu etre transmis et gurent ec ere donc dans le tampon d emission : le caract` urgent ne peut donc pas etre envoy immediatement, ere e seule une indication dexistence de caract` urgent est transmise. ere
A charge au r ecepteur de vider son tampon pour que l emission soit possible.
5.5.2 Le cote recepteur
Le fonctionnement par d efaut : Par d efaut, un caract` urgent nest pas int e dans le tampon de lecture de la socket destinatrice : ere egr seule sa position relative dans la s equence est rep ee. er Dans le cas ou un nouveau caract` urgent arrive avant que le pr edent ait ete lu, on le perd (il ` ere ec nest pas dans le tampon), seul le dernier est conserv e. La lecture du caract` urgent est r ere ealis au moyen de la primitive recv() avec lindicateur MSG OOB ee Au cours de la lecture, seul le caract` urgent est lu, quels que soient la valeur du troisi` ere eme pa` rametre et le nombre de caract` eres dans le tampon de lecture. Signalons par ailleurs quune lecture de caract` eres sans option MSG OOB bute sur un caract` ere urgent : ainsi si on a dans le tampon de lecture abcdef ou le caract` rep` la position du caract` urgent (non ecrit dans le tampon), une instruction ` ere ere ere recv(sock,ch,6,0) ; ` affectera a ch la s equence abc, une deuxi` eme instruction du m eme type affectant def sans lecture du caract` urgent qui pourra cependant etre lu ult ere erieurement. ` Dans le cas ou il ny a pas de caract` urgent a lire, mais quune indication de caract` urgent (par le ` ere ere e transmise, la demande de lecture echoue et la variable errno a la valeur EWOULD signal SIGURG) a et BLOCK. Lintegration des caract` eres urgents dans le tampon de lecture : Il est possible dinstaller une option de la socket destinatrice provoquant l ecriture des caract` eres urgents dans le tampon de lecture, la position du dernier y etant rep ee par ailleurs. er Cette demande est r ealis au moyen de la s ee equence suivante :
44
Gilles Menez
Matrise Informatique
1 2 3
Le caract` urgent sera alors lu sans utiliser lindicateur MSG OOB. ere Il continue cependant de constituer une but dans les op ee erations de lecture. Le seul moyen de rep erer le caract` urgent parmi les autres est de lire les caract` ere eres un par un et ` de tester avant chaque lecture si la position courante correspond a celle du caract` urgent. Un tel ere test est realis en utilisant la primitive ioctl() dans une s e equence de la forme :
1 2 3 4 5 6 7 8 9 10 11 12
i n t reponse ; i n t desc s o c k e t ; ... i o c t l ( desc s o c k e t , SIOCATMARK, & reponse ) ; i f ( reponse = = 1 ) ` ` / Le e c a r a c t r e a l i r e est urgent / ...
else ` ` / Le e c a r a c t r e a ...
Dans le cas ou un nouveau caract` urgent arrive avant la lecture du pr edent, cest lui qui devient ` ere ec urgent, le pr edent perdant simplement son aspect urgent (il reste cependant visible). ec
45
menez@unice.fr
Principales Options
SO BROADCAST SO DONTROUTE SO KEEPALIVE SO LINGER SO OOBINLINE SO TCP DELAY SO RCVBUF SO SNDBUF TCP MAXSEG ....
Matrise Informatique
52
Gilles Menez
Matrise Informatique
Un certain nombre dop erations de contr peuvent etre r ole ealis ees par linterm ediaire des primitives ioctl(), fcntl(), getsockopt() et setsockopt().
Rendre la socket non-bloquante, Connatre la taille maximum des segments, Mode de r eception des caract` eres urgents,
` Les options applicables aux op erations relatives a une socket peuvent etre interpr ees dans le syst` et eme ` a differents niveaux. Dans le cadre du domaine AF INET : 1. le niveau SOL SOCKET : les options correspondantes sappliqueent directement au niveau des sockets ; ` 2. les autres niveaux : ils correspondent a un protocole particulier et sont donc d esign par le es ` num du protocole tel que renvoy par un appel a la fonction getprotobyname(). Les constantes ero e symboliques de noms de protocoles tels que IPPROTO IP, IPPROTO TCP ou IPPROTO UDP peuvent etre utilis ees.
46
menez@unice.fr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifdef #endif #if 0 SO RCVLOWAT , SO SNDLOWAT , SO RCVTIMEO , SO SNDTIMEO , SO USELOOPBACK , struct sock opts char int int char opt str ; opt level ; opt name ; s t a t i c char s t a t i c char s t a t i c char s t a t i c char union val int long char struct l i n g e r struct t i m e v a l val ; / /
Matrise Informatique
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include / #include #include
sys / types . h sys / socket . h sys / time . h time . h n e t i n e t / in . h arpa / i n e t . h errno . h fcntl . h netdb . h signal . h stdio . h stdlib . h string . h sys / s t a t . h sys / uio . h unistd . h sys / wait . h sys / un . h unp . h
basic socket d e f i n i t i o n s
/ /
for pselect ()
sockaddr in
f o r nonblocking
and readv / w r i t e v
/ /
n e t i n e t / tcp . h
, int );
( o p t v a l s t r ) ( union val
, int ); SO BROADCAST, SO DONTROUTE, sock str flag , sock str flag , sock str int , sock str flag , sock str linger , sock str flag , sock str int , sock str int , sock str int , sock str int , sock str timeval , sock str timeval , sock str flag ,
sock opts [ ] = SO BROADCAST , SOL SOCKET, SO DEBUG , SO ERROR , SO KEEPALIVE , SO LINGER , SO OOBINLINE , SO RCVBUF , SO SNDBUF , SO DONTROUTE , SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SOL SOCKET, SO DEBUG, SO ERROR, SO KEEPALIVE, SO LINGER, SO OOBINLINE, SO RCVBUF, SO SNDBUF, SO RCVLOWAT, SO SNDLOWAT, SO RCVTIMEO , SO SNDTIMEO ,
SO USELOOPBACK, s o c k s t r f l a g , sock str flag , sock str flag , NULL, sock str int , sock str int , IP TTL , sock str int , sock str flag , 0, NULL sock str int ,
SO REUSEADDR , SOL SOCKET, SO REUSEPORT SO REUSEPORT , SOL SOCKET, #else SO REUSEPORT , 0, SO TYPE , IP TOS , IP TTL , TCP MAXSEG , TCP NODELAY , NULL,
SO REUSEADDR , SO REUSEPORT, 0,
64 65 #endif 66 67 68 69 70 71
63
SO TYPE, IP TOS ,
53
menez@unice.fr
72 73 / 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 / / / / /
Matrise Informatique
INDENT ON
end checkopts1
i n c l u d e checkopts2
argv )
fd , len ;
ptr ;
fd = socket ( AF INET , SOCK STREAM, 0 ) ; for ( p t r = sock opts ; p t r if ( ptr else len = sizeof ( val ) ; i f ( getsockopt ( fd , p t r
p r i n t f ( %s : , p t r
o p t v a l s t r = = NULL)
p r i n t f ( ( undefined) n ) ;
opt name , 1)
f p r i n t f ( s t d e r r , %s , getsockopt e r r o r ) ;
p r i n t f ( d e f a u l t = %s n , (
ptr
exit (0);
end checkopts2
i n c l u d e checkopts3
s t a t i c char s t a t i c char
strres [128];
s o c k s t r f l a g ( union val /
INDENT OFF
p t r , i n t len )
return ( s t r r e s ) ; INDENT ON /
end checkopts3
s t a t i c char
s o c k s t r i n t ( union val
p t r , i n t len )
i f ( len ! = sizeof ( i n t ) ) s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , size (%d) not s i z e o f ( i n t ) , len ) ; else return ( s t r r e s ) ; s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , %d , p t r
i val );
s t a t i c char
s o c k s t r l i n g e r ( union val
p t r , i n t len )
struct l i n g e r
l p t r = & ptr
linger val ;
i f ( len ! = sizeof ( struct l i n g e r ) ) s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , size (%d) not s i z e o f ( s t r u c t else s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , l o n o f f = %d , lptr return ( s t r r e s ) ; l onoff , lptr l l inger ); l i n g e r ) , len ) ; l l i n g e r = %d ,
s t a t i c char
s o c k s t r t i m e v a l ( union val
p t r , i n t len )
54
menez@unice.fr
147 148 149 150 151 152 153 154 155 156
Matrise Informatique
struct t i m e v a l
timeval val ;
i f ( len ! = sizeof ( struct t i m e v a l ) ) s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , size (%d) not s i z e o f ( s t r u c t else s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , %d sec , %d usec , tvptr return ( s t r r e s ) ; tv sec , tvptr tv usec ) ; t i m e v a l ) , len ) ;
55