bind   Début   Suivant   Sommaire   Préc.page.lue   Accueil
Section: Manuel du programmeur Linux (2)
Updated: 28 décembre 2007
Sommaire  



NOM   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
bind - Fournir un nom à une socket  



SYNOPSIS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
#include <sys/types.h>          /* Voir NOTES */
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,
         socklen_t addrlen);
 



DESCRIPTION   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
Quand une socket est créée avec l'appel système socket(2), elle existe dans l'espace des noms mais n'a pas de nom assigné). bind() affecte l'adresse spécifiée dans addr à la socket référencée par le descripteur de fichier sockfd. addrlen indique la taille, en octets, de la structure d'adresse pointée par addr. Traditionnellement cette opération est appelée « affectation d'un nom à une socket ».

Il est normalement nécessaire d'affecter une adresse locale avec bind() avant qu'une socket SOCK_STREAM puisse recevoir des connexions (voir accept(2)).

Les règles d'affectation de nom varient suivant le domaine de communication. Consultez le manuel Linux section 7 pour de plus amples informations. Pour AF_INET voir ip(7), pour AF_INET6 voir ipv6(7), pour AF_UNIX voir unix(7), pour AF_APPLETALK voir ddp(7), pour AF_PACKET voir packet(7), pour AF_X25 voir x25(7) et pour AF_NETLINK voir netlink(7). La structure actuelle passée comme argument addr dépendra de la famille d'adresses. La définition de la structure sockaddr est quelque chose comme :


struct sockaddr {
    sa_family_t sa_family;
    char        sa_data[14];
}

Le seul objectif de cette structure est de transtyper le pointeur structure passé dans addr afin d'éviter les avertissements à la compilation. Voir EXEMPLE plus loin.  



VALEUR RENVOYÉE   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
L'appel renvoie 0 s'il réussit, ou -1 s'il échoue, auquel cas errno contient le code d'erreur.  



ERREURS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
EACCES
L'adresse est protégée et l'utilisateur n'est pas le superutilisateur.
EADDRINUSE
L'adresse fournie est déjà utilisée.
EBADF
sockfd n'est pas un descripteur valide.
EINVAL
La socket possède déjà une adresse. pour les détails.
ENOTSOCK
sockfd est un descripteur de fichier, pas une socket.

Les erreurs suivantes sont spécifiques aux sockets du domaine UNIX (AF_UNIX) :

EACCES
L'accès à un composant du chemin d'accès n'est pas autorisé. (Voir aussi path_resolution(7).)
EADDRNOTAVAIL
Une interface non existante a été demandée ou l'adresse demandée n'était pas locale.
EFAULT
addr pointe en dehors de l'espace d'adresse accessible.
EINVAL
La longueur addr_len est fausse, ou la socket n'est pas de la famille AF_UNIX.
ELOOP
addr contient des références circulaires (à travers un lien symbolique).
ENAMETOOLONG
addr est trop long
ENOENT
Le fichier n'existe pas.
ENOMEM
pas assez de mémoire pour le noyau.
ENOTDIR
Un composant du chemin d'accès n'est pas un répertoire.
EROFS
L'i-noeud se trouverait dans un système de fichiers en lecture seule.
 



CONFORMITÉ   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
SVr4, BSD 4.4, POSIX.1-2001 (bind() est apparu dans BSD 4.2).  



NOTES   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
POSIX.1-2001 ne réclame pas l'inclusion de <sys/types.h>, et ce fichier d'entête n'est pas requis par Linux. Toutefois, certaines implémentations historiques (BSD) ont besoin de ce fichier d'entête et il serait probablement plus sage que les applications destinées à être portable l'incluent.

Le troisième argument de bind() est en fait un int (et c'est ce qu'utilisent BSD 4.*, libc4 et libc5). Une certaine confusion POSIX résulte du socklen_t actuel, également utilisé dans la glibc. Voir accept(2).  




BOGUES   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
Les options de proxy transparent ne sont pas décrites.  



EXEMPLE   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
Un exemple de l'utilisation de bind() avec les sockets de domaine Internet peut être trouvé dans getaddrinfo(3).

L'exemple suivant montre comment attacher une socket dans le domaine Unix (AF_UNIX), et accepter les connexions :

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MY_SOCK_PATH "/unchemin"
#define LISTEN_BACKLOG 50

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
    int sfd, cfd;
    struct sockaddr_un addr, peer_addr;
    socklen_t peer_addr_size;

    sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sfd == -1)
        handle_error("socket");

    memset(&addr, 0, sizeof(struct sockaddr_un));
                        /* Clear structure */
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, MY_SOCK_PATH,
            sizeof(addr.sun_path) - 1);

    if (bind(sfd, (struct sockaddr *) &addr,
            sizeof(struct sockaddr_un)) == -1)
        handle_error("bind");
    }

    if (listen(sfd, LISTEN_BACKLOG) == -1)
        handle_error("listen");
    }

    /* Now we can accept incoming connections one 
       at a time using accept(2) */

    peer_addr_size = sizeof(struct sockaddr_un);
    cfd = accept(sfd, (struct sockaddr *) &peer_addr,
                 &peer_addr_size);
    if (cfd == -1)
        handle_error("accept");
    }

    /* Code pour gérer la (les) connexion(s) entrante(s)... */

    /* Lorsqu'il n'est plus nécessaire, le chemin de la socket,
       MY_SOCK_PATH doit être effacé avec unlink(2) ou remove(3) */
}
x.SH VOIR AUSSI accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(7)  



TRADUCTION   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 9 octobre 1996 et révisée le 8 janvier 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 bind ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.


 



Sommaire   Début   Suivant   Sommaire   Préc.page.lue   Accueil
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
NOTES
BOGUES
EXEMPLE
TRADUCTION

Table des mots clés   Début   Suivant   Sommaire   Préc.page.lue   Accueil
EACCESERREURS
EADDRINUSEERREURS
EADDRNOTAVAILERREURS
EBADFERREURS
EFAULTERREURS
EINVALERREURS
ELOOPERREURS
ENAMETOOLONGERREURS
ENOENTERREURS
ENOMEMERREURS
ENOTDIRERREURS
ENOTSOCKERREURS
EROFSERREURS



Ce document a été créé par man2html suivi de man2html.pl, le 17/10/2008 17:49:49, en utilisant les pages de 'man'.
 

Valid HTML 4.01 Transitional