Vous êtes sur la page 1sur 104

Cours Sockets

Gilles MENEZ 24 mars 2000

Matrise dInformatique UFR Sciences - UNSA

0-0

Gilles Menez

Matrise Informatique

` Table des matieres


` 1 Le modele client-serveur 1.1 Caract erisation du mod` ele . 1.2 Serveurs dapplications . . . 1.3 Applications point-` a-point . . 1.4 Les services Unix . . . . . 1.5 Les points de communication 1.6 Les services et les ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 2 3 4 5 5 6 6 7 8 8 8 9 10 11 11 12 13 14 15 15 16 16 16 17 17 18 19 20 21 22 23 24 25 25 25 26 26 26 27 28 29

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 . . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

UNSA-24 mars 2000

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

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

6 Controle et param etrage des sockets 46 6.1 Principales options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

UNSA-24 mars 2000

ii

menez@unice.fr

Matrise Informatique

Le concept de client-serveur

UNSA-24 mars 2000

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.

` 1.1 Caracterisation du modele


En r` egle g erale, on admet : en que le serveur fournit les informations et que le client les r eceptionne. ` ` Toutefois, il est rare quun programme se borne a exp edier ou a recevoir, cest pourquoi on d enira

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.

1.2 Serveurs dapplications


Certains serveurs traitent et analysent les donn avant de transmettre le r ees esultat au client. ` Pour les diff erencier des simples serveurs de chiers et de bases de donn ees, qui se bornent a expedier des troncons dinformations sans les modier, ces serveurs dapplications sont capables dop erations complexes, comme rechercher une entr dans une base de donn et faire parvenir au client le r ee ees esultat des ventes du mois courant. En d de leur nom on distingue : epit les serveurs dapplications : Web, HTTP, ... les serveurs de chiers abritant des applications : NFS, ... Lexemple de serveur dapplications le plus repr esentatif reste le W3.

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

` 1.3 Applications point- a-point


Toutes les applications ne suivent pas n ecessairement le mod` client-serveur. ele Dans un programme de jeu en r eseau, par exemple, les deux participants exp edient et recoivent des quantit dinformations comparables (du moins lorsque le jeux est equilibr es e). Ce genre de connexion est quali de point-` e a-point.

UNSA-24 mars 2000

menez@unice.fr

Matrise Informatique

Les clients et les serveurs

UNSA-24 mars 2000

/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

1.4 Les services Unix


Une machine Unix, mais de facon g erale toute machine moderne (i.e Windows, . . .), propose et en utilise differents services . Courrier electronique : SMTP (Simple Mail Transfer Protocol) Fichiers partag : NFS (Network File System) es Web : HTTP ... La commande netstat -a permet de voir :

les services quoffre la machine (LISTEN) les services dont elle est le client (ESTABLISHED)

UNSA-24 mars 2000

menez@unice.fr

Matrise Informatique

Demultiplexage

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

1.5 Les points de communication


Beaucoup dapplications diff erentes, de la m eme machine, sont susceptibles dutiliser le r eseau au meme instant. Par cons equent, identier un message sur le r eseau uniquement par le nom de ` la machine destinatrice ne permettrait pas a cette derni` de d ere emultiplexer ` ` ` correctement le message. Cest a dire permettre a son systeme de choisir lappli` cation a laquelle est v eritablement destin le message. ee Pour r esoudre ce probl` eme, une application r eseau transmet via un port de communication qui est identi par un num sur 16 bits. Lapplication destinaire est, elle aussi, munie dun tel num (tr e ero ero es probablement diff erent). Les communications Inter Processus (IPC : Inter Process Communication) seffectuent entre des paires, formant les points de communication : host.port aristippe :1023 host.service www.inria.fr :www Bien que lon en nest pas encore parl les paquets qui vont transiter entre les machines contiennent e, les num eros des ports source et destination.

UNSA-24 mars 2000

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)

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

1.6 Les services et les ports


Les services ont des noms : par exemple smtp pour le service du courrier electronique. Les ports ont des num eros : par exemple smtp est un service qui utilise le port 25. La correspondance entre les noms des services et leurs num de ports est ero contenu dans le chier : /etc/services

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.

UNSA-24 mars 2000

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.

UNSA-24 mars 2000

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.

UNSA-24 mars 2000

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

Caracterisation des Network I O

` Une entorse a la compatibilite des I O Unix :

(proto, local-addr, local-process, foreign-addr, foreign-process)

Stream et Message ` Linterface doit permettre dacc eder a differents type de protocoles (TCP, UDP, XNS,

UNSA-24 mars 2000

....)

Gilles Menez

Matrise Informatique

2.2 Network I O et File I O


Au niveau des chiers Unix, il y a six appels syst` eme pour les entr ees sorties. 1. open, 2. create, 3. close, 4. read, 5. write, 6. lseek

Tous ces appels utilisent un le descriptor.


Linterface des entr ees sorties r eseau a n ecessite denrichir la s emantique des descripteurs avec des options et des d etails. ` Ce qui constitue une petite entorse a la compatibilit des I O de Unix ; e 2.2.1 Particularit des Network I O es

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

UNSA-24 mars 2000

menez@unice.fr

Le concept de socket
PROCESSUS PROCESSUS

Matrise Informatique

SOCKET

SOCKET

1
Niveau IP

Communication entre processus par lintermdiaire de sockets

Communication bidirectionnelle Son type

UNSA-24 mars 2000

Son domaine

Gilles Menez

Matrise Informatique

2.3 Le concept de socket


` Lobjectif des sockets est de permettre a plusieurs processus, eventuellement distants, de communi` quer ; cest a dire d echanger des informations. Les sockets constituent une g eralisation du m en ecanisme Unix dacc aux chiers. Ils permettent es de d enir une extr emite de connexion. Les processus communiquent en utilisant le mod` client-serveur, chacun des deux processus ele ` pouvant etre tour a tour client et serveur. Attention, ce nest pas le seul moyen de faire communiquer 2 processus : 1. System V Transport Layer Interface 2. BSD Sockets et si les 2 processus sont sur la m eme machine, on peut encore uitliser les BSD sockets, mais on a aussi :

Pipe Fifo Shared Memory ....

UNSA-24 mars 2000

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

Type dune socket

UNSA-24 mars 2000

menez@unice.fr

Nom symbolique domaine local format des adresses sockaddr un (include AF INET internet

Matrise Informatique

Domaine dune socket

AF UNIX

sockaddr in (include

AF NS

XEROX NS

sockaddr ns (include

AF OSI AF SNA AF CCITT AF DECnet AF APPLETALK

monde OSI SNA IBM CCITT, X25 DECnet Apple Talk

UNSA-24 mars 2000

menez@unice.fr

Gilles Menez

Matrise Informatique

2.4 Caracterisation dune socket


Chaque entit (i.e : processus) impliqu dans une communication doit disposer dun point de contact : e ee

il peut sagir dune bote aux lettres ou dun poste t ephonique. el


Une socket nest rien dautre dans le syst` eme que l equivalent de lun des ces objets. Il sagit dun point de communication bidirectionnel par lequel un processus pourra emettre ou recevoir des informations. Le parall` entre les sockets, le courrier et le t ephone est tr vrai. ele el es ` Cest deux formes de communication qui vont inf erer sur le type de la socket a choisir : ` telephone : n ecessite une connexion, linformation correspond a un message nonstructur (une e suite continue de bits ...) ` courrier : ne n ecessite pas de connexion, linformation correspond a un message structur (un e entete, ...) Une autre caract eristique importante des points de communication concerne lensemble des autres points quils permettent datteindre. ( Pour poursuivre lanalogie avec les t ephones, cest l el equivalent de la notion de poste nationaux ou d epartementaux ). Cest le domaine de la socket qui d ecide les points accessibles et lensemble des protocoles utilisables pour la communication 2.4.1 Le type dune socket

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

UNSA-24 mars 2000

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.

Toutes les combinaisons ne sont pas autoris ees.

type \ domaine SOCK STREAM SOCK DGRAM

AF UNIX AF INET AF NS Yes Yes TCP UDP IP SPP IDP Yes SPP

UNSA-24 mars 2000

SOCK RAW SOCK SEQPACKET

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

UNSA-24 mars 2000

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

2.5 La structure socket


Une socket est un point de communication, par lequel le processus peut emettre ou recevoir des informations, A lint erieur dun processus une socket sera identi par un descripteur (comme les chiers). ee Cela permet par exemple de rediriger les entr eessorties standard des processus sur des sockets. ` Cela permet aussi a tout nouveau processus (cr e par fork) dh e eriter des descripteurs de sockets de son p` ere. A tout objet est associ dans le syst` e eme un objet ayant la structure socket ( ) Ces objets sont l equivalent des inuds pour les chiers. Cest sur un tel objet quun descripteur de socket pointera (via une indirection sur un entr de la ee table des chiers ouverts).

UNSA-24 mars 2000

10

UNSA-24 mars 2000 12

menez@unice.fr

Processus Requte denvoi message Systme dexploitation Requte de rception message Processus

Domaine Unix
Matrise Informatique

Gilles Menez

Matrise Informatique

2.6 Le domaine UNIX


Le premier domaine abord est le domaine Unix . e

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 Requte denvoi message

Systme dexploitation Requte de rception

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

UNSA-24 mars 2000

11

Gilles Menez

Matrise Informatique

2.7 Les adresses


Vu de lint erieur du processus une socket est d enie par son descripteur .

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 !

UNSA-24 mars 2000

12

menez@unice.fr

Adresses dans le domaine UNIX


Format de ladresse :

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");

UNSA-24 mars 2000

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

soit au niveau externe par la commande rm,


` soit dans une application par un appel a la primitive unlink

UNSA-24 mars 2000

13

menez@unice.fr

Matrise Informatique

Adresses dans le domaine INTERNET


/

# include

netinet / in . h

Def . f o r INTERNET domain .

Adresse I n t e r n e t d une machine in addr

/ /

struct

u long s addr ; / ;

Un e n t i e r long

Adresse I n t e r n e t d une socket

/ / / /

10

struct /

11

sockaddr in domaine AF INET sin family ;

12

short /

13

Numero du p o r t : Format reseau ! !

14

u short sin port ; / Adresse i n t e r n e t : Format reseau ! !

15

16

struct i n a d d r s i n a d d r ; /

17

c a r a c t e r e s nuls . . . sin zero [8 ] ;

inutilises

18

char ;

19

dou dans le code les lignes : `


1

i n t fds ;

F i l e d e s c r i p t o r de l a socket

struct s o c k a d d r i n adresse ; / ...... adresse . s i n f a m i l y = AF INET ;

Son adresse

/ /

UNSA-24 mars 2000

adresse . s i n a d d r . s addr = h t o n l ( INADDR ANY ) ; adresse . s i n p o r t = htons ( p o r t ) ;

14

Gilles Menez

Matrise Informatique

2.7.2

Adresses dans le domaine INTERNET

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

UNSA-24 mars 2000

14

menez@unice.fr

IPv4 length AF_INET 16-bit port# 32-bit IPv4 address

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{}

pathname (unused) 128-bit IPv6 address (up to 104 bytes)

fixed length (16 bytes)

UNSA-24 mars 2000

fixed length (24 bytes)

variable length

15

menez@unice.fr

ftp telnet tftp nger ...

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

UNSA-24 mars 2000

ports assignes par le programmeur 5001 . . . 65536 . . .

16

menez@unice.fr

Les formats de representation


par un entier long (32 bits) non sign e. 0x 01 . 02 2 . FF 255 . 04 4 #IP 1

Matrise Informatique

Historiquement, ladresse Internet dune machine est repr esentee

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 :

UNSA-24 mars 2000

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

Fonctions darrangement de formats

Le probl` eme du format de repr esentation dun nombre se pose pour

htonl() ou htons() : host to network HOST NETWORK ntohl() ou ntohs() : network to host

UNSA-24 mars 2000

18

Gilles Menez

Matrise Informatique

2.7.3

Les formats de repr esentation

Ladresse dune machine Internet est repr esentee, en IPv4, par un entier long (32 bits) non sign e.
1 2 3 4 5

/ Adresse I n t e r n e t d une machine struct in addr u long s addr ; / ;

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

).

UNSA-24 mars 2000

15

menez@unice.fr

Primitives de manipulation
1

Matrise Informatique

# include # include

sys / types . h sys / socket . h

/ . . . 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

UNSA-24 mars 2000

myaddr ,

15

19

Gilles Menez

Matrise Informatique

LAPI socket
La manipulation des sockets n essite un nombre restreint de primitives. ec

3.1 File descriptors


Les File descriptors sont des nombres utilis pour les Entr es ees Sorties. eralement les r Ils sont gen esultats des appels open et create Les le descriptors sont des objets fondamentaux. On lit (read(...)) et ecrit (write(...)) dans les le descriptors.
1 2 3 4 5

i n t cc , fd , nbytes ; char buf ;

cc = read ( fd , buf , nbytes ) ; cc = w r i t e ( fd , buf , nbytes ) ;

` 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

3.2 Creation dune socket : socket(...)


` Lappel syst` eme socket(...) renvoie une valeur enti` ere, qui est assimilable a une descripteur de chier.

Il sagit en fait dun descripteur de socket (socket descriptor ou sockfd).


1 2 3 4

# include # include

sys / types . h sys / socket . h

i n t socket ( i n t domaine , i n t type , i n t p r o t o c o l ) ;

` 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 ).

UNSA-24 mars 2000

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

3.3 Suppression dune socket : close(...)


` Lappel syst` eme close(...) ferme un descripteur de chier. Il ne fait plus r erence a un chier et ef peut donc etre r eutilise.
1 2 3 4

# include # include

sys / types . h sys / socket . h

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.

3.4 Attachement dune adresse : bind(...)


Apr sa creation (et cest la diff es erence avec les chiers), la socket nest effectivement connue que du processus, qui dispose dun descripteur pour y lire ou y ecrire. Il faut lui attacher une adresse, un nom pour les autres processus, ne disposant pas du num de descripteur puissent y acc ero eder. ` Le r de la primitive bind(...) est dassocier a une socket (plut un descripteur de socket : ole ot ` sockfd), une adresse a usage du monde ext erieur.
1 2 3 4 5 6

# include # include

sys / types . h sys / socket . h

i n t bind ( i n t sockfd , struct sockaddr i n t addrlen ) ;

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

UNSA-24 mars 2000

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

# include # include # include # include # include

stdio . h stdlib . h sys / types . h sys / socket . h netinet / in . h

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 ; /

port , struct sockaddr in

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

i f ( ( desc=socket ( AF INET , type , 0 ) ) = =

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

/ /

adresse . s i n f a m i l y =AF INET ; adresse . s i n a d d r . s addr = h t o n l ( INADDR ANY ) ; adresse . s i n p o r t = htons ( p p o r t ) ; / /

Numero de p o r t en format reseau

3 ) Demande d attachement de l a socket

i f ( bind ( desc ,& adresse , longueur ) ==

1)

p e r r o r ( Attachement de l a socket i m p o s s i b l e ) ; close ( desc ) ; / return (

1);

fermeture de l a socket

UNSA-24 mars 2000

4 ) Recuperation de l adresse e f f e c t i v e d attachement .

/ / /

i f ( p adresse ! = NULL)

getsockname ( desc , p adresse ,& longueur ) ; /

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

Cree une socket de type SOCK STREAM sur p o r t quelconque

Cree une socket de type SOCK DGRAM sur p o r t 2467

# include # include # include # include # include

stdio . h stdlib . h sys / types . h sys / socket . h netinet / in . h

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

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

3.5 Adresses IP et Services


` La partie qui va suivre explicite comment envoyer ou se connecter a une machine distante.

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.

getservbyname() permet dobtenir un numero de port pour un nom de service donn e.

UNSA-24 mars 2000

18

menez@unice.fr

Resolution des adresses IP


La structure hostent structure est d enie dans suit :
1

Matrise Informatique

comme

struct hostent char char int int char

h name ; h a l i a s e s ;
h addrtype ;

/ o f f i c i a l name of host / alias list

/ 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 / /

/ host address type

/ f o r backward c o m p a t i b i l i t y # define h addr h addr list [0]

Prototypes des fonctions :


1

# include

netdb . h

struct hostent

gethostbyname ( const char name ) ;


/ f o r AF INET i n t len , i n t type ) ;

# include

sys / socket . h

struct hostent

gethostbyad d r ( const char addr ,

6 7

22

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

3.5.1

Resolution des adresses IP

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

struct hostent char char int int char

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 .

Le seul type dadresse valide est AF INET.


La phase de connexion est g eralement pr ee par la translation dun nom en num IP : en efac ero
1 2 3 4 5 6 7 8

i n t tcpopen ( char

service ,

char

host )

struct hostent hp ; ... i f ( ( hp=gethostbyname ( host ) ) = = NULL) error . . . ...

UNSA-24 mars 2000

19

menez@unice.fr

Resolution du service
La structure servent est d enie dans
1

Matrise Informatique

comme suit :

struct servent char char int char

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

Prototypes des fonctions :


1

# 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

UNSA-24 mars 2000

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

struct servent char char int char

s name ; s a l i a s e s ;
s port ; s proto ;

/ / / /

o f f i c i a l s e r v i c e name alias l i s t / p o r t number / p r o t o c o l to use /

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 ; ...

UNSA-24 mars 2000

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 . . .

# include # include # include # include # include # include /

stdio . h sys / types . h netdb . h /

for s t r u c t hostent /

sys / socket . h n e t i n e t / in . h arpa / i n e t . h

/ f o r AF INET / / f o r s t r u c t i n addr / / f o r i n e t ntoa ( ) /

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

i f ( h errno ! = 0 ) i f ( h errno else s p r i n t f ( msgstr , ( h e r r n o = %d ) , h e r r n o ) ; else msgstr [ 0 ] = 0 && h e r r n o h nerr ) s p r i n t f ( msgstr , (% s ) , h e r r l i s t [ h e r r n o ] ) ;

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 ;

register struct hostent while (

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 ( ) ) ;

i f ( ( h o s t p t r = gethostbyname ( p t r ) ) = = NULL) p r i n t f ( gethostbyname e r r o r f o r host : %s %s , continue ;

24

UNSA-24 mars 2000

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

while ( ( p t r = printf ( hostptr printf (

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)

addr type = %d , addr l e n g t h = %d n ,

hostptr

h addrtype , h

hostptr

h length );

switch ( h o s t p t r case AF INET :

h addrtype )
addr list , hostptr

pr inet ( hostptr break ; default :

h length );

p r i n t f ( unknown address type ) ; break ;

Go through a l i s t p r i n t i n g each one /


char int struct in addr

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)

UNSA-24 mars 2000

25

menez@unice.fr

Matrise Informatique

gethostbyaddr()

# include # include # include

sys / socket . h netdb . h netinet / in . h

main ( )

struct i n a d d r ipa ; struct hostent

s;

long i p = 0 x863B036F ; /

134.59.3.111 / )& ipa ,

10

11

ipa . s addr = i p ;

12

13

s = gethostbyaddr ( ( char p r i n t f ( %s n , s

14

h name ) ;

sizeof ( struct i n a d d r ) , AF INET ) ;

15

UNSA-24 mars 2000

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

Network Utility Routines

59 Open a TCP connection . / netdefs . h n e t i n e t / in . h arpa / i n e t . h 60 61 62

if ( port

= 0) e r r r e t ( tcp open : must s p e c i f y return ( 1);

e i t h e r s e r v i c e or p o r t ) ;

#include #include #include

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 ) ;

# ifndef INADDR NONE #define INADDR NONE #endif 0xffffffff /

should be in

n e t i n e t / in . h

68 69 70 71 72

First

t r y to convert the host name as a dotted decimal number . that f a i l s do we c a l l gethostbyname ( ) .

Only i f /

i f ( ( inaddr = i n e t a d d r ( host ) ) ! = INADDR NONE)

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

/ tcp srv addr ; tcp serv info ; tcp host info ; / / / /

) & inaddr , ( char

i t s dotted decimal

) & tcp srv addr . sin addr ,

sizeof ( inaddr ) ) ; t c p h o s t i n f o . h name = NULL;

struct sockaddr in struct servent struct hostent

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 /

server s I n t e r n e t socket addr from getservbyname ( ) from gethostbyname ( ) i f OK, else / /

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

i f ( ( hp = gethostbyname( host ) ) = = NULL) e r r r e t ( tcp open : host name e r r o r : %s %s ,

return (

tcp host info = bcopy ( hp

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

0, i t s the p o r t # of server ( host byte order )

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 ;

h addr , ( char h length );

found i t

by name , s t r u c t u r e copy

) & tcp srv addr . sin addr ,

fd , r e s v p o r t ;


2 /

inaddr ; host err str (); sp ; hp ;

i f ( ( fd = socket ( AF INET , SOCK STREAM, 0))

0)

e r r r e t ( tcp open : can t create TCP socket ) ; return ( 1);

0)

Initialize

the server s I n t e r n e t address s t r u c t u r e . byte I n t e r n e t address and the

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 .

e r r r e t ( tcp open : can t get a reserved TCP p o r t ) ; return ( 1);

bzero ( ( char

99 ) & t c p s r v a d d r , sizeof ( t c p s r v a d d r ) ) ; 100 101 102

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 ; /

103 104 105 106

Connect to the server . /

tcp serv info = if ( port 0)

52 53 54 55 56 57 58

i f ( connect ( fd , ( struct sockaddr

s t r u c t u r e copy

) & tcp srv addr , sizeof ( t c p s r v a d d r )) 0)

107 / 108 109 110 / 111 112

e r r r e t ( tcp open : can t connect to server ) ; close ( fd ) ; return ( 1);

t c p s r v a d d r . s i n p o r t = htons ( p o r t ) ; / else t c p s r v a d d r . s i n p o r t = sp else c a l l e r s value

s port ; / s e r v i c e s value

113 / 114

return ( fd ) ;

a l l OK

27

UNSA-24 mars 2000

menez@unice.fr

Matrise Informatique

Communication par datagrammes

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 :

demander la cr eation dune socket,


` demander eventuellement lattachement a un port (sinon cest automatique),

construire ladresse de son interlocuteur,


` proceder a des emissions et des r eceptions de messages.

UNSA-24 mars 2000

28

Gilles Menez

Matrise Informatique

La communication par datagrammes

` 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

UNSA-24 mars 2000

21

menez@unice.fr

Matrise Informatique

Organisation dun serveur UDP

SERVEUR UDP socket()

bind() CLIENT UDP recvfrom() socket()

bloque jusqu un envoi de donnes dun client

bind()

donnes (demande de service) sendto() traitement de la demande

sendto()

donnes (rponse au service) recvfrom()

UNSA-24 mars 2000

29

Gilles Menez

Matrise Informatique

4.1 Organisation dun client-serveur UDP


Un processus souhaitant communiquer avec le monde ext erieur par linterm ediaire dune socket de ce type doit donc r ealiser, selon les circonstances, un certain nombre des op erations suivantes : 1. demander la cr eation dune socket, ` 2. demander eventuellement lattachement a un port (sinon cest automatique), 3. construire ladresse de son interlocuteur, ` 4. proc eder a des emissions et des r eceptions de messages.

UNSA-24 mars 2000

22

menez@unice.fr

Un serveur peut etre ecrit de mani` iterative ou concurrente. ere

Matrise Informatique

Serveur Iteratif et Serveur Concurrent

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

UNSA-24 mars 2000

SS20 ou DEC).

30

Gilles Menez

Matrise Informatique

4.2 Serveur Iteratif et Serveur Concurrent


Un serveur nest en g eral sous le contr daucun terminal. en ole Quand un serveur est lanc il recoit des propri e, etaires et groupes propri etaires effectifs et r eels. Pour une demande de service dun client particulier, ces caract eristiques doivent etre modi ees, au moins pour le processus de service qui dialoguera avec le client an de prendre en compte les droits de ce client. Un serveur peut etre ecrit de mani` it ere erative ou concurrente. 1. Dans le premier cas, 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 peuvent sexecuter rapidement e ` et correspondent a un sch ema question r eponse. Cest le cas de la plupart des serveurs d evelopp avec des sockets du type SOCK DGRAM. es 2. Le second mode est plus adapt au mode connect quon retrouve avec les sockets de type e e SOCK STREAM. ` On gere des ux, pas des salves, comme avec les sockets du type SOCK DGRAM. Dans ce cas, plusieurs processus de service travaillent de mani` concurrente (voir parall` ere ele sur les nouvelles machines multiprocesseurs ...)

UNSA-24 mars 2000

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

Squelette dun client-serveur UDP


Format /


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 /

= htons ( ps0 ) ; de l a socket

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

i f ( bind ( sd0 , ( s t r u c t sockaddr

/ ) ( 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)

Recuperation de l adresse e f f e c t i v e d attachement .

getsockname ( sd0 , ( s t r u c t sockaddr /

) padr0 ,& l s 0 ) ;

main ( i n t argc , char

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

i f ( ( hp1=gethostbyname ( argv [ 1 ] ) ) = = NULL)

= / 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

5 ) P r e p a r a t i o n de l adresse du d e s t i n a t a i r e / / Recuperation de l adresse IP a p a r t i r du nom / f p r i n t f ( s t d e r r , machine %s inconnue n , argv [ 1 ] ) ;


exit (2);

else adr1 . s i n f a m i l y = AF INET ; adr1 . s i n p o r t

memcpy(& adr1 . s i n a d d r . s a d d r , hp1

Le meme p o r t que adr0 / h addr , hp1 h l e n g t h ) ; f p r i n t f ( s t d o u t , machine %s % n , hp1 h name , s


= htons ( ps0 ) ; / i n e t n t o a ( adr1 . s i n a d d r ) ) ; Boucle emission r e c e p t i o n a p a r t i c u l a r i s e r

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 ;

padr2 = & adr2 ;


/

selon que

84 85 86 87 88 89 90 91 92

int ls2 = sizeof ( struct sockaddr in ) ;

Message recu de 0 a 99 / char msg out [ 3 ] = 0 ; / Message a envoyer 0 a 99 / / 0 ) V e r i f i c a t i o n s de base /


char msg in [ 3 ] = 0 ; i f ( argc ! = 2 ) f p r i n t f ( s t d e r r , Syntaxe d appel : a . out nom du host exit (2);

peer n ) ; /

93 94 95 96

1)

C r e a t i o n : Domaine AF INET , type DGRAM, p r o t o . par d e f a u t

97 98 99 100

i f ( ( sd0=socket ( AF INET , SOCK DGRAM, 0 ) ) = = p e r r o r ( [ SOCK DGRAM, AF INET , 0 ] ) ; else

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 ) ;

p r i n t f ( socket [ SOCK DGRAM, AF INET , 0 ] creee n ) ; P r e p a r a t i o n de l adresse d attachement = AF INET ;

101 102 103

2)

adr0 . s i n f a m i l y

adr0 . s i n a d d r . s a d d r = h t o n l ( INADDR ANY ) ;

/ / Format

reseau

104 105

31

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

4.3 Squelette dun client-serveur UDP


La structure du client-serveur est sym etrique ... cela peut donc etre le m eme programme.

UNSA-24 mars 2000

24

menez@unice.fr

Primitives denvois de messages


La primitive sendto() :
1

Matrise Informatique

# include # include

sys / types . h sys / socket . h

i n t sendto ( i n t sockfd , char

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

sys / types . h sys / socket . h

i n t sendmsg ( int s , const s t r u c t msghdr unsigned i n t f l a g s ) ;

6 7

msg ,

32

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

4.4 Lenvoi dun message


4.4.1 La primitive sendto(...)

` ` 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

sys / types . h sys / socket . h

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)

UNSA-24 mars 2000

25

menez@unice.fr

La primitive recvfrom() :
1

Matrise Informatique

Primitives de reception de messages

# include # include

sys / types . h sys / socket . h

i n t recvfrom ( i n t sockfd , char

buff , /

i n t nbytes , i n t f l a g s , / 0 ou MSG PEEK s t r u c t sockaddr int );

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

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

4.5 La reception dun message


4.5.1 La primitive recvfrom()

` 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

sys / types . h sys / socket . h

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

UNSA-24 mars 2000

26

menez@unice.fr

Mecanismes de scrutation
correspondantes nonbloquante (primitives fctnl et ioctl ;

Matrise Informatique

` Une premi` solution, consiste a rendre les op ere erations

).

` 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.

UNSA-24 mars 2000

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.

UNSA-24 mars 2000

27

menez@unice.fr

Matrise Informatique

La primitive select()

Les ensembles de descripteurs : fd set predeni dans


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

sys / types . h sys / time . h

int select ( s i z e t nb desc ,

7 8 9

ptr lecture , fd set ptr ecriture , fd set ptr exception , const s t r u c t t i m e v a l p t r t e m p o r i s a t i o n ;


fd set );

35

UNSA-24 mars 2000

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

UNSA-24 mars 2000

28

menez@unice.fr

Utilisation de la primitive select()


1

Matrise Informatique

# include # include # include # include

stdio . h sys / time . h sys / types . h unistd . h

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

UNSA-24 mars 2000

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.

On peut coupler ce m ecanisme avec la primitive select pour


savoir lequel peut permettre une lecture ` coup sur. a

UNSA-24 mars 2000

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.

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.

On peut coupler ce m ecanisme avec la primitive select pour savoir lequel peut permettre une
lecture ` coup sur. a

UNSA-24 mars 2000

29

menez@unice.fr

1 2 3 4 1

Matrise Informatique

Les Pseudo Connexions

La primitive connect : i n t connect ( i n t d e s c r i p t e u r , s t r u c t sockaddr int lg adresse );

ptr adresse ,

Les primitives denvoi et de r eception : s s i z e t send ( i n t d e s c r i p t e u r , void

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

Consultation du nom de la socket paire :


1

i n t getpeername ( i n t d e s c i p t e u r , s t r u c t sockaddr int );

2 3 4

ptr adresse ,

ptr longueur

38

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

4.8 Les pseudo-connexions


On a vu dans les sections pr edentes que chaque demande d ec emission dun message n ecessite dans les primitives sendto ou sendmsg la sp ecication de ladresse de la socket destinatrice. Il est possible de m emoriser dans la structure (socket) associ a une socket ladresse dune socket ee ` paire vers laquelle seront automatiquement dirig les messages emis, sans quil soit besoin de la es ` specier a chaque envoi. Mais attention, il sagit l` dun m a ecanisme nonn egoci avec lautre entit ... on peut imaginer etablir e e une connexion vers une destination nil. Elle ne consiste quen lenregistrement dune information dans le bloc de contr de la socket locale. ole 4.8.1 La primitive connect

` Un appel a la fonction :
1 2 3 4 5

i n t connect ( int descripteur , struct sockaddr p t r a d r e s s e , int lg adresse );

` 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

s s i z e t recv ( int descripteur , void p t r , s i z e t nb caracteres , i n t o p t i o n / MSG PEEK s i on veut l i r e );

sans e x t r a i r e

UNSA-24 mars 2000

30

Gilles Menez

Matrise Informatique

4.8.3

Consultation du nom de la socket paire

` Un appel a la primitive :
1 2 3

i n t getpeername ( i n t d e s c i p t e u r , struct sockaddr p t r a d r e s s e , int ptr longueur ) ;

en cas d echec.

permet de r ecup erer ladresse de la socket associ au travers de la pseudoconnexion. Elle rend ee

UNSA-24 mars 2000

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

Communication en mode connecte

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.

Lune des entit le serveur, est en attente passive de es,


demande de connexion qui lui adressera une entit en position e de client qui prendra donc linitiative de la demande de connexion. Apres cette phase initiale, on retrouve la sym etrie dans la communication : chacune des deux extr es peut envoyer et emit recevoir des caract` eres et peut prendre linitiative de demander la

UNSA-24 mars 2000

fermeture de la connexion.

39

Gilles Menez

Matrise Informatique

La communication en mode connecte

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.

UNSA-24 mars 2000

32

menez@unice.fr

Organisation dun serveur TCP


Processus Serveur socket() bind()

Matrise Informatique

listen()

accept()

fork() Processus de Service Gestion du dialogue avec le client

UNSA-24 mars 2000

40

Gilles Menez

Matrise Informatique

5.1 Etablissement de la connexion


5.1.1 Le point de vue du serveur

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.

UNSA-24 mars 2000

33

menez@unice.fr

La primitive listen(...)
1

Matrise Informatique

Primitives de gestion de la connexion

int l i s t e n ( / d e s c r i p t e u r de l a socket d ecoute int descripteur , / nb acceptable de sockets pendantes i n t nb pendantes );

/ /

La primitive accept(...)
1

i n t accept ( / d e s c r i p t e u r de l a socket d ecoute int descripteur , / adr du c l i e n t connecte s t r u c t sockaddr

/ / /

ptr adresse ,

/ T a i l l e de l adr du c l i e n t connecte int );

ptr lg adresse

41

UNSA-24 mars 2000

Gilles Menez

Matrise Informatique

5.1.2

Primitives de gestion de la connexion :

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

listen ( int descripteur , i n t nb pendantes

/ /

de l a socket d ecoute / nb acceptable de sockets pendantes

);

` 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.

Ce comportement lui vaut son nom de socket de service .


` La r eussite dun appel a cette primitive suppose evidemment quun client ait r ealis e une demande de connexion par la primitive connect(). ` Un appel a la fonction accept() est normalement bloquant : le processus appelant est bloqu sil e ny a aucune connexion pendante.

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.

UNSA-24 mars 2000

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

Squelette dun serveur TCP concurrent

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

s i g a c t i o n ( SIGCHLD,& a c t i o n , NULL ) ; p o r t = a t o i ( argv [ 1 ] ) ; l g a d r e s s e = s i z e o f ( adresse ) ; /

Creation

et attachement de l a socket d ecoute

i f ( ( s o c k e t e c o u t e = c r e e r s o c k e t ( SOCK STREAM, & p o r t , & adresse ))== f p r i n t f ( s t d e r r , C r e a t i o n de socket / exit (2);

/ 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)

extern i n t c r e e r s o c k e t ( i n t type , i n t # define TRUE 1 struct sigaction action ;

p port , struct

sockaddr in

56 exit (2); p adresse ) ; 57 58 59 60 /

Boucle
/

d a t t e n t e de connexion

/ /

while ( TRUE) s o c k e t s e r v i c e =accept ( s o c k e t e c o u t e , & adresse , & l g a d r e s s e ) ;

void e l i m i n e r z o m b i e ( i n t s i g ) p r i n t f ( t e r m i n a i s o n d un processus de s e r v i c e w a i t ( NULL ) ;

n ) ;

61 62 63 64

main ( i n t argc , char int port ; int lg adresse ;

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 ;

1 && e r r n o ==EINTR) continue ; / E r r e u r p l u s grave / i f ( s o c k e t s e r v i c e ==1)


i f ( s o c k e t s e r v i c e == p e r r o r ( accept ) ; exit (2); p r i n t f ( Connexion acceptee n ) ;

Reception

d un s i g n a l ( probablement SIGCHLD)

int socket ecoute , socket service ;

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 /

if ( fork ( ) != 0 ) exit (0); setsid ( ) ; p r i n t f ( s e r v e u r de p i d %d lance du h a n d l e r du

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

close ( socket service ) ;

action . sa handler =eliminer zombie ;

UNSA-24 mars 2000

42

menez@unice.fr

Organisation dun client TCP


Opration optionnelle socket() bind()

Matrise Informatique

Construction de ladresse du serveur

Demande de connexion connect() Echec Russite

Gestion du dialogue avec le client

UNSA-24 mars 2000

43

Gilles Menez

Matrise Informatique

5.1.4

Le point de vue des clients

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.

UNSA-24 mars 2000

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

Squelette dun client


/

Processus

de lancement d un c l i e n t TCP

#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

extern i n t c r e e r s o c k e t ( i n t type , i n t main ( i n t argc , char int port ; /

p port , struct /

sockaddr in

p adresse ) ;

argv [ ] )
pour l adresse de l a machine d i s t a n t e

struct sockaddr in adresse serveur , a d r e s s e c l i e n t ;

p o r t d ecoute du s e r v e u r

int socket client ; struct hostent /

hp ; /

Test du nombre de parametres . 3)

/ / / 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

i f ( ( hp=gethostbyname ( argv [ 1 ] ) ) = = NULL)

f p r i n t f ( s t d e r r , machine %s inconnue n , argv [ 1 ] ) ; /

exit (2);

C r e a t i o n et attachement de l a socket c l i e n t sur un p o r t quelconque

p o r t =0; i f ( ( s o c k e t c l i e n t = c r e e r s o c k e t ( SOCK STREAM, & p o r t , & a d r e s s e c l i e n t ))==

f p r i n t f ( s t d e r r , C r e a t i o n du socket du c l i e n t i m p o s s i b l e n ) ; e x i t ( 2 ) ; p r i n t f ( C r e a t i o n du socket du c l i e n t sur l e p o r t %d n , ntohs ( a d r e s s e c l i e n t . s i n p o r t ) ) ; /

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)

a d r e s s e s e r v e u r . s i n f a m i l y = AF INET ; a d r e s s e s e r v e u r . s i n p o r t =htons ( a t o i ( argv [ 2 ] ) ) ; memcpy(& a d r e s s e s e r v e u r . s i n a d d r . s addr , hp /

Demande de
exit (2);

connexion au s e r v e u r

i f ( connect ( s o c k e t c l i e n t ,& a d r e s s e s e r v e u r , sizeof ( a d r e s s e s e r v e u r )) == p e r r o r ( connect ) ;

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

UNSA-24 mars 2000

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

Fichier : client1 tcp . c Role : Commande d echo de p e t i t s messages /


stdio . h stdlib . h

#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 [ ] )

UNSA-24 mars 2000

45

Gilles Menez

Matrise Informatique

5.1.5

Les primitives de gestion de la connexion

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

i n t connect ( i n t d e s c r i p t e u r , / socket l o c a l e / struct sockaddr p t r a d r e s s e , / socket d i s t a n t e int lg adresse / longueur de l adresse / );

` 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.

UNSA-24 mars 2000

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 );

UNSA-24 mars 2000

46

Gilles Menez

Matrise Informatique

5.2 La fermeture de la connexion


5.2.1 La primitive close()

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

i n t shutdown ( int descriptgeur , i n t sens / 0 , 1 ou 2 );

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.

UNSA-24 mars 2000

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

Exemple dutilisation de shutdown()

F i c h i e r : serveur shutdown . c Role : Exemple d u t i l i s a t i o n de l a p r i m i t i v e shutdown /


# include # include # include stdio . h stdlib . h unistd . h

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

/ / / /

/ Fermeture de l a socket / Reception i m p o s s i b l e / rep = 0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Fichier : client shutdown . c Role : Exemple d u t i l i s a t i o n de l a p r i m i t i v e shutdown /


# include # include # include stdio . h stdlib . h signal . h

void h a n d l e r s i g p i p e ( i n t s i g ) p r i n t f ( s i g n a l SIGPIPE recu n ) ;

void c l i e n t s e r v i c e ( i n t sock , i n t argc , char i n t rep ; s i g n a l ( SIGPIPE , h a n d l e r s i g p i p e ) ;

argv [ ] )

w r i t e ( sock , ABCDEFGHIJKLMNO , 1 0 ) ; / Emission sleep ( 1 0 ) ;

p r i n t f ( w r i t e =%dn , w r i t e ( sock , PQRST , 5 ) ) ; / Emission

/ /

23 24 25 26

22

p r i n t f ( shutdown =%dn , shutdown ( sock , 1 ) ) ; / Fermeture de l a socket

/ A p a r t i r de maintenant un appel a w r i t e genere un SIGPIPE p r i n t f ( w r i t e =%dn , w r i t e ( sock , UVWXY , 5 ) ) ;

UNSA-24 mars 2000

47

menez@unice.fr

m m p1 , ... , pn <= m pn

Matrise Informatique

` Phenomene de d e-synchronisation : emiss. r ecept.

p2 Emission m

p3 Reception p1

UNSA-24 mars 2000

p4

48

Gilles Menez

Matrise Informatique

5.3 Le dialogue client serveur


Une fois la connexion etablie, le dialogue peut commencer. 5.3.1 ` Ph enomene de d esynchronisation

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

Reception p1 , ... , pn <= m


5.3.2 Taille de buffers et limitations

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.

UNSA-24 mars 2000

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).

UNSA-24 mars 2000

39

UNSA-24 mars 2000 49

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

Mecanisme de gestion des tampons


Matrise Informatique

Gilles Menez

Matrise Informatique

5.3.3

Gestion des tampons

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

sauf indication contraire, la lecture y est bloquante si le tampon est vide.


De plus, du fait de lutilisation de TCP, un contr de ux est garanti. ole

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.

UNSA-24 mars 2000

40

menez@unice.fr

Primitives denvois de messages


La primitive write() :
1

Matrise Informatique

ssize t

write ( int descripteur , void

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 );

UNSA-24 mars 2000

50

Gilles Menez

Matrise Informatique

5.3.4

Lenvoi de caract` eres

Linterface standard write(...)


1 2 3 4 5

ssize t

write ( int descripteur , void p t r , s i z e t nb caracteres );

` ` Un tel appel correspond a la demande denvoi sur la socket des nb caract` eres lus a ladresse ptr.

La primitive renvoie le nombre de caract` lus. eres


` En ce qui concerne les d etails de fonctionnement et les causes derreurs, se reporter a la primitive send(). Linterface sp ecique send(...) Lutilisation de la primitive write(...) ne permet pas dutiliser pleinement les fonctionnalit ofes fertes par les protocoles particuliers utilis pour la communication via les sockets (SOCK STREAM, es ees AF INET), comme par exemple lenvoi de donn urgentes. La primitive send(...) permet cela.
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 );

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.

UNSA-24 mars 2000

41

menez@unice.fr

La primitive read()
1

Matrise Informatique

Primitives de reception de messages

s s i z e t read ( int descripteur , void

ptr ,
nb caracteres

size t );

La primitive recv()
1

s s i z e t recv ( int descripteur , void

ptr ,
nb caracteres ,

size t

int option );

UNSA-24 mars 2000

51

Gilles Menez

Matrise Informatique

5.3.5

La reception de caract` eres

Linterface standard read(...)


1 2 3 4 5

s s i z e t read ( int descripteur , void p t r , s i z e t nb caracteres );

` 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.

Le nombre de caract` lus est renvoy eres e.


` En ce qui concerne les d etails de fonctionnement et les causes derreurs, se reporter a la primitive recv(). Linterface sp ecique recv()
1 2 3 4 5 6

s s i z e t recv ( int descripteur , void p t r , s i z e t nb caracteres , int option );

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

La fonction renvoie le nombre de caract` lus, eres


La valeur 0 indique que la connexion a ete fermee,

et sauf indication contraire, un appel bloque si le tampon est vide.

UNSA-24 mars 2000

42

Gilles Menez

Matrise Informatique

5.4 Exemples complets dapplications


5.4.1 Commande decho de petits messages

, 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

Decoupage des envois

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.

UNSA-24 mars 2000

43

Gilles Menez

Matrise Informatique

5.5 La prise en compte de messages urgents


Il est possible dans certains domaines (AF INET en particulier), dadresser depuis une socket connect ee des donnees urgentes vers la socket paire : il sagit de donn quil est possible de lire sans avoir ees ` edent, comme limpose le fonctionnement normal de la communication en a lire les donnees qui prec` mode continue des sockets du type SOCK STREAM. Limplantation r ealis dans le domaine UNIX pour le domaine AF INET permet la ee memorisation dun seul caract` de ce type. ere 5.5.1 Le cote emetteur

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 :

UNSA-24 mars 2000

44

Gilles Menez

Matrise Informatique

1 2 3

i n t on =1; i n t desc s o c k e t ; setsockopt ( desc s o c k e t , SOL SOCKET, SO OOBINLINE , & on , sizeof ( on ) ) ;

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 ...

l i r e n est pas urgent

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

UNSA-24 mars 2000

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

UNSA-24 mars 2000

52

Gilles Menez

Matrise Informatique

Controle et parametrage des sockets

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.

6.1 Principales options


1. SO BROADCAST : appliqu aux sockets de type SOCK DGRAM dans le domaine AF INET, elle ee autorise la diffusion de messages depuis la socket. 2. SO DONTROUTE : elle sapplique aux sockets de type SOCK STREAM. Les donn ees emises sur la socket courtcircuitent la proc edure de routage standard : elles sont dirig sur linterface ees deduite de la partie r eseau de leur adresse de destination. 3. SO KEEPALIVE : elle sapplique aux sockets de type SOCK STREAM dans le domaine AF INET. Elle permet de tester quune connexion est encore active et eventuellement de la fermer. 4. SO LINGER : elle sapplique aux sockets de type SOCK STREAM dans le domaine AF INET. Elle permet de modier les param` etres de fermeture dune socket. 5. SO OOBINLINE : elle sapplique aux sockets de type SOCK STREAM dans le domaine AF INET. Elle sp ecie que les donn ees quali durgentes sont plac dans le tampon de r ees ees eception de la socket destinatrice et par suite peuvent etre lues sans utiliser lindicateur MSG OOB. 6. SO TCP DELAY : il sagit dune option qui sapplique au niveau IPPROTO TCP et donc exclusivement aux sockets de type SOCK STREAM dans le domaine AF INET. Elle permet de modier la proc edur de constitution des segments. 7. SO RCVBUF : taille du tampon de r eception de la socket emission de la socket 8. SO SNDBUF : taille du tampon d 9. TCP MAXSEG : il sagit dune option qui sapplique au niveau IPPROTO TCP et donc exclusivement aux sockets de type SOCK STREAM dans le domaine AF INET. Elle permet de connatre la taille maximale dun segment TCP. 10. ....

UNSA-24 mars 2000

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

i n c l u d e checkopts1 INDENT OFF /

Stevens vous aide ...


/ / / / / /

#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 system data types timeval /

basic socket d e f i n i t i o n s

for select () timespec


/ /

for pselect ()

sockaddr in

and other I n t e r n e t defns /

inet (3) functions /

f o r nonblocking

f o r S xxx f i l e mode constants / f o r iovec

and readv / w r i t e v

/ /

n e t i n e t / tcp . h

f o r TCP xxx defines

i val ; l val ; c val [10]; linger val ; timeval val ;

s o c k s t r f l a g ( union val s o c k s t r i n t ( union val

, int );

, int ); , int ); , int );

s o c k s t r l i n g e r ( union val s o c k s t r t i m e v a l ( union val

( 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

SOL SOCKET, IPPROTO IP ,

SO TYPE, IP TOS ,

IPPROTO IP , IPPROTO TCP, TCP MAXSEG, IPPROTO TCP, TCP NODELAY, 0,

53

UNSA-24 mars 2000

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

int main ( i n t argc , char int

argv )

struct sock opts

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 s t r ! = NULL; p t r ++) opt str );

o p t v a l s t r = = NULL)

p r i n t f ( ( undefined) n ) ;

opt level , ptr

opt name , 1)

&val , & len ) == else

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

o p t v a l s t r )(& val , len ) ) ;

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 )

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 s n p r i n t f ( s t r r e s , sizeof ( s t r r e s ) , %s , ( p t r i v a l = = 0 ) ? o f f : on ) ;

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 ,

140 141 142 143 144 145 146

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

UNSA-24 mars 2000

menez@unice.fr

147 148 149 150 151 152 153 154 155 156

Matrise Informatique

struct t i m e v a l

tvptr = & ptr

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 ) ;

UNSA-24 mars 2000

55

Vous aimerez peut-être aussi