Date création : 27-03-2008 20:23:44
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section2 - Appels système]
SOCKET
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- VALEUR RENVOYÉE
- ERREURS
- CONFORMITÉ
- NOTES
- BOGUES
- VOIR AUSSI
- TRADUCTION
NOM
socket - Créer un point de communication
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
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
|
|
PF_UNIX, PF_LOCAL
|
Communication locale
|
unix(7)
|
|
PF_INET
| Protocoles Internet IPv4 |
ip(7)
|
|
PF_INET6
| Protocoles Internet IPv6 |
ipv6(7)
|
|
PF_IPX
| IPX - Protocoles Novell |
|
|
PF_NETLINK
|
Interface utilisateur noyau
|
netlink(7)
|
|
PF_X25
| Protocole ITU-T X.25 / ISO-8208 |
x25(7)
|
|
PF_AX25
|
Protocole AX.25 radio amateur
|
|
|
PF_ATMPVC
| Accès direct ATM PVCs |
|
|
PF_APPLETALK
| Appletalk |
ddp(7)
|
|
PF_PACKET
|
Interface paquet bas-niveau
|
packet(7)
|
La socket a le type indiqué, ce qui fixe 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 read.
- 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. Voir packet(7).
Certains types de sockets peuvent ne pas être implémentés par toutes les
familles de protocoles. Par exemple, SOCK_SEQPACKET n'est pas implémenté
pour AF_INET.
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 ; voir protocols(5). Voir
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èmes 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 fixer 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, voir 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 fixer ou lire les options.
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.
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.
- 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.
CONFORMITÉ
BSD 4.4, POSIX.1-2001. 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 Système V).
NOTES
Les constantes explicites utilisées sous BSD 4.x pour les familles de
protocoles sont PF_UNIX, PF_INET... et AF_UNIX... 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'adresse », et les standards ultérieurs utilisent AF_* partout.
L'en-tête <sys/types.h> n'est nécessaire que pour libc4 et
précédentes. Certains programmes, comme util-linux, prétendent être
portables à toutes les versions de Linux et des bibliothèques. Ces paquets
ont sans doute besoin de ce fichier d'en-tête.
BOGUES
SOCK_UUCP n'est pas encore implémentée.
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 » a été
réimprimé dans UNIX Programmer's Supplementary Documents Volume 1.
« BSD Interprocess Communication Tutorial » est reproduit dans UNIX
Programmer's Supplementary Documents Volume 1.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par
Christophe Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003,
puis par Alain Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction par un rapport de bogue sur
le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en
utilisant la commande
« man -L C <section> <page_de_man> ».
|