Les Sockets - people.irisa.fr · Une Socket : un point de communication par lequel un processus...
Transcript of Les Sockets - people.irisa.fr · Une Socket : un point de communication par lequel un processus...
1
ute/Cours/Internet/06-socket.fm- 12 Octobre 1998 17:27 )
.
nix, Eyrolles, 1992.
international, 1995.
ll, 1991.
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Les Sockets
/home/kouna/d01/adp/bcousin/F
Plan
• Présentation
• L’enchainement des primitives
• Les primitives
• Conclusion
• Quelques informations supplémentaires
Bibliographie
• L.Toutain, Réseaux locaux et Internet, Hermès, 1996
• M.Gabassi, B.Dupouy, L’informatique répartie sous U
• J-M.Rifflet, La communication sous Unix, EdiScience
• D.E.Comer, Internetworking with TCP/IP, Prentice-Ha
cb
2
1.
1.
tions
unication,
:nternet !
station) : domaine Unix !
us peut émettre ou recevoir des données
atible avec l’identificateur (de descripteur)
son initialisation avec les adresses et lesrs : open() !
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Présentation
1. Définition
Les Sockets : Interface de programmation pour les communica
❏ Ensemble de primitives assurant ce service,
❏ Générique : s’adapte aux différents besoins de comm
❏ Indépendant de protocoles et de réseaux particuliers. Mais développé à l’origine sous Unix 4BSD, pour I
❏ N’utilise pas forcément un réseau :. Par exemple : communication locale (interne à une
Une Socket : un point de communication par lequel un process
❏ Homogène avec les identificateurs d’E/S :. l’identificateur (de descripteur) de Socket est comp
de fichiers.
❏ On distingue la création de la Socket : socket(), denuméros de port : bind(), connect(), à contrario des fichie
3
1.
1.
sein des applications réparties
articulier (n˚ port),
uelle station.
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
2. Les domaines
Les sockets peuvent gérer plusieursfamilles protocolaires :
- Internet : PF_INET
- fichiers locaux : PF_UNIX
- OSI, SNA, DEC, CCITT(X25), Appletalk,
- etc.
3. Serveur/Client
Le paradigme du Client/Serveur est extrèmement courant au
Un serveur :
- processus rendant unservice spécifique identifié par unport p
- en attente sur une station (@IP)
Des clients :
- processus appelant le serveur afin d’obtenir le service,
- lancé à la demande à partir généralement de n’importe q
4
1.
1.
en attente, tampons d’émission et de récep-
1.
l’extérieur
t sockaddr_in
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
4. Les structures de données
4.1 La structuresocket
Descripteur du point d’accès à la communication :
- type, options, état, temporisateurs, liste des processus tion, etc.
Structure décrite dans le fichier <sys/socketvar.h>
4.2 La structuresockaddr
Adresse : désignation spécifique permettant d’être identifié de
Structure décrite dans le fichier <netinet/in.h>
address family protocol port
IP address
unused
unsused
0 . . . . . . . . . . . . . 16 . . . . . . . . . . . . . . 32 bits
struc
5
1.
e de données contenant des informations surle
onf, etc.
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Structure polymorphe (générique) :
- adaption à la famille protocolaire utilisée :. par exemple : sockaddr_un, sockaddr_in.
4.3 La structurehostent
Chaque système maintient localement (ou accède à) une bass stations du réseau.
Structure définie dans le fichier <netdb.h> :
- liste de noms,
- liste d’adresses,
- type d’adresse et longueur;
Informations :
- issues des fichiers /etc/hosts, /etc/config, /etc/nsswitch.c
- ou obtenues à l’aide de DNS ou NIS.
6
2.
2.
t()
endto()
e()
connect()
read() write() recv() send()
d()
Client
pseudo-connexion
transfert de données
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
L’enchainement des primitives
1. Exemple d’enchainement simple en mode non-connecté
socket()
bind()
recvfrom() ou sendto()
close()
connect()
read() write() recv() send()
socke
recvfrom() ou s
clos
bin
Serveur
pseudo-connexion
généralement bloquant optionnel
UDP
7
2.
ket()
ose()
nnect()
) write() recv() send()
d()
munication !
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
2. Exemple d’enchainement simple en mode connecté
socket()
bind()
close()
accept()
read() write() recv() send()
soc
cl
co
read(
Serveur Client
listen() bin
Chaque “close()” ne ferme qu’un seul sens de com
Fork()
TCP
8
3.
3.
otocol);
DGRAM,0);
ation :REAM,RAM,
protocole àutiliser,
(0 => lesystèmechoisit leprotocolele mieuxadapté aumode)..h>
<netinet/in.h>
ans :
voir dans :
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Les primitives
1. La création d’une Socket
int socket (int domain, int type, int pr
Exemple : s=socket(PF_INET,SOCK_
descripteurde la socket,
domaine decommunication :PF_UNIX ouPF_INET, etc.
-1 si erreur
mode decommunicSOCK_STSOCK_DGetc.
<sys/socket<sys/socket.h>voir liste dans :
voir liste d
9
3.
dsock, int lg_addsock);
retions
,
taille de lastructureprécédente(obtenueavec sizeof)
_sock)))lisation du bind(...)’’);
adressest choisi par le noyau
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
2. Renseignement de la Socket avec les informations locales
int bind(int s, struct sockaddr_in * ad
cf <netinet/in.h>
0 si succès-1 si erreur
pointeur sur la structucontenant les informasur la machine locale(domaine, nº de portet adresse IP)
id. local
socket
Exemple : if (bind(s, &add_sock,sizeof(add{fprintf(stderr,‘‘Echec dans la réaexit(EXIT_BINDING_SOCK);}
créée
de la
INADDR_ANY: remplace n’importe quellesi le numéro de port n’est pas précisé, il e
10
3. en cours d’établissement
d’attente dese communication 5)
NREQ) < 0)ten");TEN);
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
3. Longueur maximum de la file d’attente des communications
int listen(int s, int backlog);
0 si succès-1 si erreur
taille de la filedemandes d( par défaut=
id. de lasocketlocale
Exemple : if (listen(sock,MAXCO {perror("Echec du lis
exit(EXIT_ERR_LIS}
11
3.
, int * fromlen);
nt
ptables
la taille de lastructure estmise ici
r, &size_add_initiator);
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
4. Définition de l’ensemble des connexions acceptables
int accept(int s, struct sockaddr_in * from
id. de la
ou -1 si erreurnouvelle socket
la structure contena
les émetteurs acce
Exemple : new_sock = accept(s, &add_initiatoif (new_sock < 0)
{perror("Echec de l'accept"); exit(EXIT_ERR_ACCEPT);
}
les informations sur
12
3.
st, int lg_dest);
e(...))
taille de lastructureprécédente
addsock)) < 0)et");
_SOCK);
retions
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
5. Renseignement de la Socket pour le destinataire
Etablissement de la (pseudo-)connexion
int connect(int s, struct sockaddr_in * de
0 si succès-1 si erreur
id. de lasocketlocale
sur la socket distante(récupérable avec
gethostbynam
Exemple : if (connect(sock, &addsock, sizeof( {perror("Echec de lien de sock exit(EXIT_ERR_CONNECT
}
pointeur sur la structucontenant les informa
13
3.
ur
k_inf, int * lg_sk_inf);
anten entrée etsortie la taillede la structure
sk_inf, int * lg_sk_inf);
ais pour accéderabli au préalablees)
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
6. Primitives d’accès aux informations sur la Socket
Obtenir l’adresse IP d’une socket dont on connaît le descripte
int getsockname(int s, struct sockaddr_in * s
id. de la0 ou -1la structure conten
recherchées(param. d’entrée et de sortie)
socket
int getpeername(int s, struct sockaddr_in *
joue le même rôle que getsockname() mà la socket distante avec laquelle on a étune association (utilisable dans les 2 mod
les informations
14
3.
yte);
es
buf
nombre
d’octetsà lire
maximum
XBUFFER)) <= 0) de données");REAM);
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
7. Primitives de réception de données
Strictement identiques aux primitives habituelles d’E/S :
int read(int s, char * buf, int nb
nombre d’octets lus les données reçusont mises dans lazone pointée par
Exemple : if ((nblu=read(new_sock, buf, MA{perror("Echec en réception
exit(EXIT_ERR_RECV_ST}
ou -1 si erreur
0 si la connexion est fermée
15
3.
flag,om, int * fromlen);
, int flag);
t flag);
ur identifier l’émetteur
à fournir directement
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
8. Autres primitives de réception de données
Similaire au “read()” :
int recvfrom(int s, char * buf, int nbyte, intstruct sockaddr_in * fr
int recv(int s, char * buf, int nbyte
int recvmsg(int s, struct msghdr * msg, in
=> utile surtout en mode non-connecté po
=> utilisable plutôt en mode connecté
=> pour réduire le nombre de paramètres
16
3.
g,est, int * destlen);
flag);
);
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
9. Primitives d’émission de données
Identiques ou similiaires au “write()” habituel :
int write(int s, char * buf, int nbyte);
int sendto(int s, char * buf, int nbyte, int flastruct sockaddr_in * d
int sendmsg(int s, struct msghdr * msg, int
int send(int s, char * buf, int nbyte, int flag
17
3.
ntificateurla socket
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
10. Primitive de libération de la socket
Libère l’espace de stockage associé à la Socket,
Libère la connexion (si elle existe !)
int close(int s);
idede
0, si succès-1, si échec
18
3. ux sites
melen);
* name);
h >
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
11. Primitives d’interrogation de la base de données relatives a
- pour obtenir le nom de la machine locale :
- pour obtenir l’adresse d’une machine :
int gethostname(char * name, int na
0 ou -1le nom de machine(tronqué à namelen car.)est renvoyé dans name
struct hostent * gethostbyname(char
voir définition de la structure dans <netdb.
19
3.
esse :
yées par ces fonctions sont définies dans<n
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
12. Autres primitives d’interrogation de la base de données :
- pour obtenir desinfos sur une machine dont on connaît l’adr. gethostbyaddr()
- pour connaître leprotocole utilisé :. getprotobyname(), getprotobynumber()...
- pour identifier leréseau sur lequel on travaille :. getnetbyname(), getnetbyaddr()...
- pour avoir des informations sur unservice donné :. getservbyname(), getservbyport()...
(voir liste des services dans le fichier/etc/services)
NB : Toutes les structures de données utilisées et/ou renvoetdb.h>
20
4.
our les communications. Par exemple :
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Conclusion
Il existe de nombreuses autres interfaces de programmation p
- WinSock. proposé pour IBM PC
- TLI (“transport level interface”). proposé par Unix System V. implémentation par Stream. compatible Socket
Pour d’autres informations :
- Le man !
- les documentations des constructeurs,
- les livres,
- les exemples d’applications existantes !!
21
5.
5.
5.
t
5.
5.
AY
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
Encore plus d’informations diverses
1. inetd : /etc/inetd.conf
/etc/services
2. Les signaux :
SIGIO : socket est prête pour une entrée-sortie
SIGURG : données urgentes sont disponibles dans une socke
SIGPIPE : il n’est plus possible d’écrire sur une socket
3. Les émissions asynchrones :
- select()
- read/write() non-bloquant
4. Les fonctions de contrôle
- ioctl() : paramètre FIONBIO, fcntl() : paramètre O_NDEL
- setsockopt(), getsockopt()
22
5. dresse IP :
5.
■ Programmation des communications■
____B.Cousin et C.Viho - © IFSIC - Université Rennes I
5. Traduction de notation d’adresse entre “dotted decimal” et a
- address = inet_addr(string);
- string = inet_ntoa(inet_addr);
6. Consultation de la base de données réparties : DNS
Recherche dans la BdD par nom ou par adresse :
- info_station = gethostbyname(nom_station);
- info_station = gethostbyaddr(adresse_station);
- sethostent(), gethostent(), endhostend()