IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Man page 2 : socket

SOCKET 2 "31 décembre 2013" Linux "Manuel du programmeur Linux"

Page d'accueil du man

Cette page de documentation est issue d'une conversion automatique de developpez.com.
Les traductions proviennent des sites Debian, Linux Kernel et du projet Perkamon.
N'hésitez pas à laisser vos suggestions, avis ou commentaires : 12 commentaires Donner une note à l´article (5).

Article lu   fois.

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. NOM

socket - Créer un point de communication

2. SYNOPSIS

#include <sys/types.h> /* Consultez NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

3. DESCRIPTION

socket() crée un point de communication, et renvoie un descripteur.

Le paramètre domain indique le domaine de communication pour le dialogue ; ceci sélectionne la famille de protocole à employer. Elles sont définies dans le fichier <sys/socket.h>. Les formats actuellement proposés sont :

Nom Utilisation Page
T{
AF_UNIX, AF_LOCAL
T} T{
Communication locale
T} T{
unix(7)
T}
T{
AF_INET
T} Protocoles Internet IPv4 T{
ip(7)
T}
T{
AF_INET6
T} Protocoles Internet IPv6 T{
ipv6(7)
T}
T{
AF_IPX
T} IPX - Protocoles Novell
T{
AF_NETLINK
T} T{
Interface utilisateur noyau
T} T{
netlink(7)
T}
T{
AF_X25
T} Protocole ITU-T X.25 / ISO-8208 T{
x25(7)
T}
T{
AF_AX25
T} T{
Protocole AX.25 radio amateur
T}
T{
AF_ATMPVC
T} Accès direct ATM PVCs
T{
AF_APPLETALK
T} Appletalk T{
ddp(7)
T}
T{
AF_PACKET
T} T{
Interface paquet bas-niveau
T} T{
packet(7)
T}

La socket a le type indiqué, ce qui indique la sémantique des communications. Les types définis actuellement sont :

  • SOCK_STREAM
                    Support de dialogue garantissant l'intégrité, fournissant un flux de données binaires, et intégrant un mécanisme pour les transmissions de données hors-bande.
  • SOCK_DGRAM
        Transmissions sans connexion, non garantie, de datagrammes de longueur maximale fixe.
  • SOCK_SEQPACKET
        Dialogue garantissant l'intégrité, pour le transport de datagrammes de longueur fixe. Le lecteur doit lire le paquet de données complet à chaque appel système récupérant l'entrée.
  • SOCK_RAW
        Accès direct aux données réseau.
  • SOCK_RDM
        Transmission fiable de datagrammes, sans garantie de l'ordre de délivrance.
  • SOCK_PACKET
        Obsolète, à ne pas utiliser dans les programmes actuels. Consultez packet(7).

Certains types de sockets peuvent ne pas être implémentés par toutes les familles de protocoles.

Depuis Linux 2.6.27, le paramètre type a un autre objectif : en plus d'indiquer le type de socket, il peut inclure les valeurs suivantes en les combinant par un OU binaire, pour modifier le comportement de socket() :

  • SOCK_NONBLOCK
                    Placer l'attribut d'état de fichier O_NONBLOCK sur le nouveau descripteur de fichier ouvert. Utiliser cet attribut économise des appels supplémentaires à fcntl(2) pour obtenir le même résultat.
  • SOCK_CLOEXEC
        Placer l'attribut « close-on-exec » (FD_CLOEXEC) sur le nouveau descripteur de fichier. Consultez la description de l'attribut O_CLOEXEC dans open(2) pour savoir pourquoi cela peut être utile.

Le protocole à utiliser sur la socket est indiqué par l'argument protocol. Normalement, il n'y a qu'un seul protocole par type de socket pour une famille donnée, auquel cas l'argument protocol peut être nul. Néanmoins, rien ne s'oppose à ce que plusieurs protocoles existent, auquel cas il est nécessaire de le spécifier. Le numéro de protocole dépend du domaine de communication de la socket ; consultez protocols(5). Consultez getprotoent(3) pour savoir comment associer un nom de protocole à un numéro.

Une socket de type SOCK_STREAM est un flux d'octets full-duplex, similaire aux tubes (pipes). Elle ne préserve pas les limites d'enregistrements. Une socket SOCK_STREAM doit être dans un état connecté avant que des données puisse y être lues ou écrites. Une connexion sur une autre socket est établie par l'appel système connect(2). Une fois connectée, les données y sont transmises par read(2) et write(2) ou par des variantes de send(2) et recv(2). Quand une session se termine, on referme la socket avec close(2). Les données hors-bande sont envoyées ou reçues en utilisant send(2) et recv(2).

Les protocoles de communication qui implémentent les sockets SOCK_STREAM garantissent qu'aucune donnée n'est perdue ou dupliquée. Si un bloc de données, pour lequel le correspondant a suffisamment de place dans son tampon, n'est pas transmis correctement dans un délai raisonnable, la connexion est considérée comme inutilisable. Si l'option SO_KEEPALIVE est activée sur la socket, le protocole vérifie, d'une manière qui lui est spécifique, si le correspondant est toujours actif. Un signal SIGPIPE est envoyé au processus tentant d'écrire sur une socket inutilisable, forçant les programmes ne gérant pas ce signal à se terminer. Les sockets de type SOCK_SEQPACKET emploient les mêmes appels système que celles de types SOCK_STREAM, à la différence que la fonction read(2) ne renverra que le nombre d'octets requis, et toute autre donnée restante dans le paquet sera éliminée. De plus, les frontières des messages seront préservées.

Les sockets de type SOCK_DGRAM ou SOCK_RAW permettent l'envoi de datagrammes aux correspondants indiqués dans l'appel système sendto(2). Les datagrammes sont généralement lus par la fonction recvfrom(2), qui fournit également l'adresse du correspondant.

Les sockets SOCK_PACKET sont obsolètes. Elles servent à recevoir les paquets bruts directement depuis le gestionnaire de périphérique. Utilisez plutôt packet(7).

Un appel à fcntl(2) avec l'argument F_SETOWN permet de préciser un processus ou un groupe de processus qui recevront un signal SIGURG lors de l'arrivée de données hors-bande, ou le signal SIGPIPE lorsqu'une connexion sur une socket SOCK_STREAM se termine inopinément. Cette fonction permet également de définir le processus ou groupe de processus qui recevront une notification asynchrone des événements d'entrées-sorties par le signal SIGIO. L'utilisation de F_SETOWN est équivalent à un appel ioctl(2) avec l'argument FIOSETOWN ou SIOCSPGRP.

Lorsque le réseau indique une condition d'erreur au module du protocole (par exemple avec un message ICMP pour IP), un drapeau signale une erreur en attente sur la socket. L'opération suivante sur cette socket renverra ce code d'erreur. Pour certains protocoles, il est possible d'activer une file d'attente d'erreurs par socket. Pour plus de détails, consultez IP_RECVERR dans ip(7).

Les opérations sur les sockets sont contrôlées par des options du niveau socket. Ces options sont définies dans <sys/socket.h>. Les fonctions setsockopt(2) et getsockopt(2) sont utilisées respectivement pour définir ou lire les options.

4. VALEUR RENVOYÉE

socket() renvoie un descripteur référençant la socket créée en cas de réussite. En cas d'échec -1 est renvoyé, et errno contient le code d'erreur.

5. ERREURS

  • EACCES
        La création d'une socket avec le type et le protocole indiqués n'est pas autorisée.
  • EAFNOSUPPORT
        L'implémentation ne supporte pas la famille d'adresses indiquée.
  • EINVAL
        Protocole inconnu, ou famille de protocole inexistante.
  • EINVAL Attributs incorrects dans type.
  • EMFILE
        La table des fichiers est pleine.
  • ENFILE
        La limite du nombre total de fichiers ouverts sur le système a été atteinte.
  • ENOBUFS ou ENOMEM
        Pas suffisamment d'espace pour allouer les tampons nécessaires. La socket ne peut être créée tant que suffisamment de ressources ne sont pas libérées.
  • EPROTONOSUPPORT
        Le type de protocole, ou le protocole lui-même n'est pas disponible dans ce domaine de communication.

D'autres erreurs peuvent être dues aux modules de protocoles sous-jacents.

6. CONFORMITÉ

BSD 4.4, POSIX.1-2001. Les attributs SOCK_NONBLOCK et SOCK_CLOEXEC sont spécifiques à Linux. La fonction socket() est apparue dans BSD 4.2. Elle est généralement portable de/vers les systèmes non-BSD supportant des clones des sockets BSD (y compris les variantes de System V).

7. NOTES

POSIX.1-2001 ne requiert pas l'inclusion de <sys/types.h>, et cet en(hytête n'est pas nécessaire sous Linux. Cependant, il doit être inclus sous certaines implémentations historiques (BSD), et les applications portables devraient probablement l'utiliser. Les constantes explicites utilisées sous BSD 4.x pour les familles de protocoles sont PF_UNIX, PF_INET, etc. alors que AF_UNIX, AF_INET, etc. sont utilisées pour les familles d'adresses. Toutefois, même la page de manuel de BSD indiquait « La famille de protocoles est généralement la même que la famille d'adresses », et les standards ultérieurs utilisent AF_* partout.

8. EXEMPLE

Un exemple d'utilisation de socket() se trouve dans la page de manuel de getaddrinfo(3).

9. VOIR AUSSI

accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), ip(7), socket(7), tcp(7), udp(7), unix(7) « An Introductory 4.3BSD Interprocess Communication Tutorial » et « BSB Interprocess Communication Tutorial », réimprimés dans UNIX Programmer's Supplementary Documents Volume 1.

10. COLOPHON

Cette page fait partie de la publication 3.61 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

11. TRADUCTION

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

BSD_4_CLAUSE_UCB
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the University of California, Berkeley and its contributors. 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.