bind, fonction (winsock2.h)
La lier fonction associe une adresse locale à un socket.
Syntaxe
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Paramètres
[in] s
Descripteur identifiant un socket indépendant.
[in] name
Pointeur vers une structure sockaddr de l’adresse locale à affecter au socket lié.
[in] namelen
Longueur, en octets, de la valeur pointée par le nom paramètre.
Valeur de retour
Si aucune erreur ne se produit, lier retourne zéro. Sinon, elle retourne SOCKET_ERROR et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.
Code d’erreur | Signification |
---|---|
|
|
Le sous-système réseau a échoué. | |
Une tentative a été effectuée pour accéder à un socket d’une manière interdite par ses autorisations d’accès.
Cette erreur est retournée si une tentative de liaison d’un socket datagram à l’adresse de diffusion a échoué, car l’option setsockopt SO_BROADCAST n’est pas activée. |
|
Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée.
Cette erreur est retournée si un processus sur l’ordinateur est déjà lié à la même adresse complète et que le socket n’a pas été marqué pour autoriser la réutilisation des adresses avec SO_REUSEADDR. Par exemple, l’adresse IP et le port spécifiés dans le nom paramètre sont déjà liés à un autre socket utilisé par une autre application. Pour plus d’informations, consultez l’option de socket SO_REUSEADDR dans la référence options de socket |
|
L’adresse demandée n’est pas valide dans son contexte.
Cette erreur est retournée si l’adresse spécifiée pointée par le nom paramètre n’est pas une adresse IP locale valide sur cet ordinateur. |
|
Le système a détecté une adresse de pointeur non valide lors de la tentative d’utilisation d’un argument de pointeur dans un appel.
Cette erreur est retournée si le nom paramètre a la valeur NULL, le paramètre name ou namelen n’est pas une partie valide de l’espace d’adressage de l’utilisateur, le paramètre namelen est trop petit, le paramètre nom contient un format d’adresse incorrect pour la famille d’adresses associée, ou les deux premiers octets du bloc de mémoire spécifiés par nom ne correspondent pas à la famille d’adresses associée avec le descripteur de socket s. |
|
Un appel Windows Sockets 1.1 bloquant est en cours, ou le fournisseur de services traite toujours une fonction de rappel. | |
Un argument non valide a été fourni.
Cette erreur est retournée du du socket |
|
Une opération sur un socket n’a pas pu être effectuée, car le système n’a pas suffisamment d’espace tampon ou parce qu’une file d’attente était pleine.
Cette erreur est retournée de mémoires tampons insuffisantes ou il y a trop de connexions. |
|
Une opération a été tentée sur quelque chose qui n’est pas un socket.
Cette erreur est retournée si le descripteur dans le paramètre de n’est pas un socket. |
Remarques
La fonction lier est requise sur un socket non connecté avant les appels suivants à la fonction écouter. Il est normalement utilisé pour établir une liaison à des sockets orientés connexion (flux) ou sans connexion (datagramme). La fonction de liaison
Lorsqu’un socket est créé avec un appel à la fonction de socket
Un nom se compose de trois parties lors de l’utilisation de la famille d’adresses Internet :
- Famille d’adresses.
- Adresse de l’hôte.
- Numéro de port qui identifie l’application.
Dans Windows Sockets 2, le nom
Si une application ne s’occupe pas de l’adresse locale affectée, spécifiez la valeur constante INADDR_ANY pour une adresse locale IPv4 ou la valeur constante in6addr_any pour une adresse locale IPv6 dans le membre sa_data du nom paramètre. Cela permet au fournisseur de services sous-jacent d’utiliser n’importe quelle adresse réseau appropriée, ce qui simplifie potentiellement la programmation d’applications en présence d'hôtes multihomed (c’est-à-dire des hôtes qui ont plusieurs interfaces réseau et adresses).
Pour TCP/IP, si le port est spécifié comme zéro, le fournisseur de services affecte un port unique à l’application à partir de la plage de ports client dynamique. Sur Windows Vista et versions ultérieures, la plage de ports client dynamique est une valeur comprise entre 49152 et 65535. Il s’agit d’une modification de Windows Server 2003 et antérieure où la plage de ports client dynamique était une valeur comprise entre 1025 et 5000. La valeur maximale de la plage de ports dynamiques du client peut être modifiée en définissant une valeur sous la clé de Registre suivante :
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
La valeur de Registre MaxUserPort définit la valeur à utiliser pour la valeur maximale de la plage de ports client dynamique. Vous devez redémarrer l’ordinateur pour que ce paramètre prenne effet.
Sur Windows Vista et versions ultérieures, la plage de ports client dynamique peut être consultée et modifiée à l’aide de netsh commandes. La plage de ports client dynamique peut être définie différemment pour UDP et TCP, ainsi que pour IPv4 et IPv6. Pour plus d’informations, consultez 929851de la base de connaissances .
L’application peut utiliser getsockname après avoir appelé lier pour apprendre l’adresse et le port qui a été affecté au socket. Si l’adresse Internet est égale à INADDR_ANY ou in6addr_any, getsockname ne peut pas nécessairement fournir l’adresse tant que le socket n’est pas connecté, car plusieurs adresses peuvent être valides si l’hôte est multihomed. La liaison à un numéro de port spécifique autre que le port 0 est déconseillée pour les applications clientes, car il existe un risque de conflit avec un autre socket qui utilise déjà ce numéro de port sur l’ordinateur local.
Pour les opérations de multidiffusion, la méthode préférée consiste à appeler la fonction lier pour associer un socket à une adresse IP locale, puis à joindre le groupe de multidiffusion. Bien que cet ordre d’opérations ne soit pas obligatoire, il est fortement recommandé. Par conséquent, une application de multidiffusion sélectionnerait d’abord une adresse IPv4 ou IPv6 sur l’ordinateur local, l’adresse IPv4 générique (INADDR_ANY) ou l’adresse IPv6 générique (in6addr_any). L’application de multidiffusion appelle ensuite la fonction lier à cette adresse dans le membre sa_data du nom pour associer l’adresse IP locale au socket. Si une adresse générique a été spécifiée, Windows sélectionne l’adresse IP locale à utiliser. Une fois la fonction lier terminée, une application rejoint ensuite le groupe de multidiffusion d’intérêt. Pour plus d’informations sur la jonction d’un groupe de multidiffusion, consultez la section sur programmation multidiffusion. Ce socket peut ensuite être utilisé pour recevoir des paquets de multidiffusion à partir du groupe de multidiffusion à l’aide de larecv
La fonction lier n’est normalement pas nécessaire pour les opérations d’envoi à un groupe de multidiffusion. Les fonctions sendto,WSASendMsg, et fonctions WSASendTo lient implicitement le socket à l’adresse générique si le socket n’est pas déjà lié. La fonction de liaison
notes de pour les sockets IrDA
- Le fichier d’en-tête Af_irda.h doit être inclus explicitement.
- Les noms locaux ne sont pas exposés dans IrDA. Par conséquent, les sockets clients IrDA ne doivent jamais appeler la fonction lier avant la connecter fonction. Si le socket IrDA était précédemment lié à un nom de service à l’aide de liaison, la fonction connecter échoue avec SOCKET_ERROR.
- Si le nom du service est de la forme « LSAP-SELxxx », où xxx est un entier décimal dans la plage 1 à 127, l’adresse indique une LSAP-SEL xxx spécifique plutôt qu’un nom de service. Les noms de service tels que ceux-ci permettent aux applications serveur d’accepter les connexions entrantes dirigées vers un LSAP-SEL spécifique, sans exécuter d’abord une requête de nom de service ISA pour obtenir le LSAP-SEL associé. Un exemple de ce type de nom de service est un appareil non-Windows qui ne prend pas en charge IAS.
Windows Phone 8 : Cette fonction est prise en charge pour les applications du Windows Phone Store sur Windows Phone 8 et versions ultérieures.
windows 8.1 et Windows Server 2012 R2: cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.
Exemples
L’exemple suivant illustre l’utilisation de la fonction lier. Pour obtenir un autre exemple qui utilise la fonction lier, consultez Prise en main de Winsock.
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
// Declare some variables
WSADATA wsaData;
int iResult = 0; // used to return function results
// the listening socket to be created
SOCKET ListenSocket = INVALID_SOCKET;
// The socket address to be passed to bind
sockaddr_in service;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
//----------------------
// Bind the socket.
iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
else
wprintf(L"bind returned success\n");
WSACleanup();
return 0;
}
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows 8.1, Windows Vista [applications de bureau | Applications UWP] |
serveur minimum pris en charge | Windows Server 2003 [applications de bureau | Applications UWP] |
plateforme cible | Windows |
d’en-tête | winsock2.h (inclure Winsock2.h) |
bibliothèque | Ws2_32.lib |
DLL | Ws2_32.dll |
Voir aussi
options de socket SOL_SOCKET