Exit Zen
1 ../../exercises/sockets.rst:4
English
Utilisation de sockets pour la communication interprocessus
3 ../../exercises/sockets.rst:52
English
Le socket est une abstraction puissante car il permet aux processus de communiquer même s'ils sont situés sur des ordinateurs différents. Dans ce cas précis, la communication inter-processus passe par un réseau.
4 ../../exercises/sockets.rst:98
English
Les applications en réseau sont généralement mises en œuvre à l'aide de l'interface :term:`socket` :term:`API`. Cette API a été conçue lorsque TCP/IP a été implémenté pour la première fois dans le système d'exploitation `Unix BSD`_ [Sechrest]_ [LFJLMT]_, et a servi de modèle pour de nombreuses API entre les applications et la pile réseau dans un système d'exploitation. Bien que l'API socket soit très populaire, d'autres API ont également été développées. Par exemple, l'API STREAMS a été ajoutée à plusieurs variantes d'Unix System V [Rago1993]_. L'API socket est supportée par la plupart des langages de programmation et plusieurs manuels lui ont été consacrés. Les utilisateurs du langage C peuvent consulter [DC2009]_, [Stevens1998]_, [SFR2004]_ ou [Kerrisk2010]_. L'implémentation Java de l'API socket est décrite dans [CD2008]_ et dans le `tutoriel Java <http://java.sun.com/docs/books/tutorial/networking/sockets/index.html>`_. Dans cette section, nous utiliserons l'API socket C pour illustrer les concepts clés.
5 ../../exercises/sockets.rst:100
English
L'API socket est de très bas niveau et ne doit être utilisée que lorsque vous avez besoin d'un contrôle complet de l'accès au réseau. Si votre application a simplement besoin, par exemple, d'extraire des données d'un serveur web, il existe des API beaucoup plus simples et de plus haut niveau.
6 ../../exercises/sockets.rst:102
English
Une discussion détaillée de l'API de socket sort du cadre de cette section et les références citées ci-dessus fournissent une discussion détaillée de tous les détails de l'API de socket. Pour commencer, il est intéressant de comparer l'API socket avec les primitives de service que nous avons abordées dans le chapitre précédent. Considérons d'abord le service sans connexion qui se compose des deux primitives suivantes :
7 ../../exercises/sockets.rst:104
English
`DATA.request(destination,message)` est utilisé pour envoyer un message à une destination spécifiée. Dans cette API socket, cela correspond à la méthode ``send``.
8 ../../exercises/sockets.rst:105
English
`DATA.indication(message)` est émis par le service de transport pour délivrer un message à l'application. Dans l'API socket, cela correspond au retour de la méthode ``recv`` qui est appelée par l'application.
9 ../../exercises/sockets.rst:107
English
Les primitives `DATA` sont échangées via un point d'accès au service. Dans l'API socket, l'équivalent du point d'accès au service est le `socket`. Une `socket` est une structure de données qui est maintenue par la pile réseau et qui est utilisée par l'application à chaque fois qu'elle doit envoyer ou recevoir des données à travers la pile réseau.
10 ../../exercises/sockets.rst:110
English
Envoi de données à un pair à l'aide d'une socket
12 ../../exercises/sockets.rst:114
English
L'appel système ``sendto`` permet d'envoyer des données à un pair identifié par son adresse de socket via un socket donné.
13 ../../exercises/sockets.rst:120
English
Le premier argument est le descripteur de fichier de la socket que nous utilisons pour effectuer la communication. ``buf`` est un tampon de longueur ``len`` contenant les octets à envoyer à l'homologue. L'utilisation de l'argument ``flags`` est hors de portée de cette section et peut être mis à 0. ``dest_addr`` est l'adresse de la socket de destination à laquelle nous voulons envoyer les octets, sa longueur est passée en utilisant l'argument ``addrlen`'.
14 ../../exercises/sockets.rst:122
English
Dans l'exemple suivant, un programme C envoie les octets ``'h'``, ``'e'``, ``'l'``, ``'l'`` et ``'o'`` à un processus distant situé à l'adresse ``peer_addr``, en utilisant la socket ``sock`` déjà créée.
15 ../../exercises/sockets.rst:135
English
Comme la fonction ``sendto`` est générique, cette fonction fonctionnera correctement indépendamment du fait que l'adresse de l'homologue soit définie comme un chemin sur le système de fichiers de l'ordinateur ou une adresse réseau.
16 ../../exercises/sockets.rst:139
English
Recevoir des données d'un pair en utilisant un socket
18 ../../exercises/sockets.rst:144
English
Le programme suivant lie son socket à une adresse de socket donnée et attend ensuite de recevoir de nouveaux octets, en utilisant le socket ``sock`` déjà créé.
19 ../../exercises/sockets.rst:173
English
En fonction de la famille d'adresse de la socket, le système d'exploitation peut implicitement assigner une adresse à un socket non liée lors d'un appel à ``write``, ``send`` ou ``sendto``. Bien que ce comportement soit utile, sa description précise n'entre pas dans le cadre de cette section.
20 ../../exercises/sockets.rst:175
English
En utilisant ce code, le programme lira et imprimera un message arbitraire reçu d'un homologue arbitraire qui connaît l'adresse de socket du programme. Si nous voulons connaître l'adresse de l'homologue qui nous a envoyé le message, nous pouvons utiliser l'appel système ``recvfrom``. C'est ce que fait une version modifiée de ``bind_and_receive_from_peer`` ci-dessous.
21 ../../exercises/sockets.rst:213
English
Cette fonction utilise maintenant l'appel système ``recvfrom`` qui fournira également l'adresse du pair qui a envoyé le message. Comme les adresses sont génériques et peuvent avoir différentes tailles, ``recvfrom`` nous indique également la taille de l'adresse qu'il a écrite.
22 ../../exercises/sockets.rst:216
English
``connect``:connecter un socket à une adresse distante
24 ../../exercises/sockets.rst:224
English
Cet appel système va assigner la socket ``sockfd`` à l'adresse de socket distante ``addr``. Le processus peut alors utiliser les appels système ``send`` et ``write`` qui ne spécifient pas l'adresse de la socket de destination. De plus, les appels à ``recv`` et ``read`` ne délivreront que les messages envoyés par cette adresse distante. Ceci est utile lorsque l'on ne s'intéresse qu'aux messages des autres pairs.