Partager via


WSASocketW, fonction (winsock2.h)

La fonction WSASocket crée un socket lié à un fournisseur de services de transport spécifique.

Syntaxe

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

Paramètres

[in] af

Spécification de la famille d’adresses. Les valeurs possibles pour la famille d’adresses sont définies dans le fichier d’en-tête Winsock2.h .

Sur la SDK Windows publiée pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé et les valeurs possibles pour la famille d’adresses sont définies dans le fichier d’en-tête Ws2def.h. Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.

Les valeurs actuellement prises en charge sont AF_INET ou AF_INET6, qui sont les formats de famille d’adresses Internet pour IPv4 et IPv6. D’autres options pour la famille d’adresses (AF_NETBIOS à utiliser avec NetBIOS, par exemple) sont prises en charge si un fournisseur de services Windows Sockets pour la famille d’adresses est installé. Notez que les valeurs de la famille d’adresses AF_ et des constantes de famille de protocole PF_ sont identiques (par exemple , AF_INET et PF_INET), de sorte que l’une ou l’autre constante peut être utilisée.

Le tableau ci-dessous répertorie les valeurs courantes pour la famille d’adresses, bien que de nombreuses autres valeurs soient possibles.

Af Signification
AF_UNSPEC
0
La famille d’adresses n’est pas spécifiée.
AF_INET
2
Famille d’adresses IPv4 (Internet Protocol version 4).
AF_IPX
6
Famille d’adresses IPX/SPX. Cette famille d’adresses est uniquement prise en charge si le protocole de transport compatible NWLink IPX/SPX NetBIOS est installé.

Cette famille d’adresses n’est pas prise en charge sur Windows Vista et versions ultérieures.

AF_APPLETALK
16
Famille d’adresses AppleTalk. Cette famille d’adresses est prise en charge uniquement si le protocole AppleTalk est installé.

Cette famille d’adresses n’est pas prise en charge sur Windows Vista et versions ultérieures.

AF_NETBIOS
17
Famille d’adresses NetBIOS. Cette famille d’adresses est prise en charge uniquement si le fournisseur Windows Sockets pour NetBIOS est installé.

Le fournisseur Windows Sockets pour NetBIOS est pris en charge sur les versions 32 bits de Windows. Ce fournisseur est installé par défaut sur les versions 32 bits de Windows.

Le fournisseur Windows Sockets pour NetBIOS n’est pas pris en charge sur les versions 64 bits de Windows, notamment Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 ou Windows XP.

Le fournisseur Windows Sockets pour NetBIOS prend uniquement en charge les sockets pour lesquels le paramètre type est défini sur SOCK_DGRAM.

Le fournisseur Windows Sockets pour NetBIOS n’est pas directement lié à l’interface de programmation NetBIOS . L’interface de programmation NetBIOS n’est pas prise en charge sur Windows Vista, Windows Server 2008 et versions ultérieures.

AF_INET6
23
Famille d’adresses IPv6 (Internet Protocol version 6).
AF_IRDA
26
L’IrDA (Infrared Data Association) adresse la famille.

Cette famille d’adresses est prise en charge uniquement si un port infrarouge et un pilote sont installés sur l’ordinateur.

AF_BTH
32
Famille d’adresses Bluetooth.

Cette famille d’adresses est prise en charge sur Windows XP avec SP2 ou version ultérieure si un adaptateur et un pilote Bluetooth sont installés sur l’ordinateur.

[in] type

Spécification de type pour le nouveau socket.

Les valeurs possibles pour le type de socket sont définies dans le fichier d’en-tête Winsock2.h .

Le tableau suivant répertorie les valeurs possibles pour le paramètre type pris en charge pour Windows Sockets 2 :

Type Signification
SOCK_STREAM
1
Type de socket qui fournit des flux d’octets séquencés, fiables, bidirectionnel et basés sur la connexion avec un mécanisme de transmission de données OOB. Ce type de socket utilise le protocole TCP (Transmission Control Protocol) pour la famille d’adresses Internet (AF_INET ou AF_INET6).
SOCK_DGRAM
2
Type de socket qui prend en charge les datagrammes, qui sont des mémoires tampons sans connexion et non fiables d’une longueur maximale fixe (généralement petite). Ce type de socket utilise le protocole UDP (User Datagram Protocol) pour la famille d’adresses Internet (AF_INET ou AF_INET6).
SOCK_RAW
3
Type de socket qui fournit un socket brut qui permet à une application de manipuler l’en-tête de protocole de couche supérieure suivant. Pour manipuler l’en-tête IPv4, l’option de socket IP_HDRINCL doit être définie sur le socket. Pour manipuler l’en-tête IPv6, l’option de socket IPV6_HDRINCL doit être définie sur le socket.
SOCK_RDM
4
Type de socket qui fournit un datagramme de message fiable. Un exemple de ce type est l’implémentation du protocole de multidiffusion général pragmatique (PGM) dans Windows, souvent appelée programmation de multidiffusion fiable.

Cette valeur de type n’est prise en charge que si le protocole De multidiffusion fiable est installé.

SOCK_SEQPACKET
5
Type de socket qui fournit un paquet de pseudo-flux basé sur des datagrammes.
 

Dans Windows Sockets 2, de nouveaux types de sockets ont été introduits. Une application peut découvrir dynamiquement les attributs de chaque protocole de transport disponible via la fonction WSAEnumProtocols . Ainsi, une application peut déterminer le type de socket et les options de protocole possibles pour une famille d’adresses et utiliser ces informations lors de la spécification de ce paramètre. Les définitions de type de socket dans les fichiers d’en-tête Winsock2.h et Ws2def.h sont régulièrement mises à jour à mesure que de nouveaux types de sockets, familles d’adresses et protocoles sont définis.

Dans Windows Sockets 1.1, les seuls types de sockets possibles sont SOCK_DGRAM et SOCK_STREAM.

[in] protocol

Protocole à utiliser. Les options possibles pour le paramètre de protocole sont spécifiques à la famille d’adresses et au type de socket spécifiés. Les valeurs possibles pour le protocole sont définies dans les fichiers d’en-tête Winsock2.h et Wsrm.h .

Sur le SDK Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé et ce paramètre peut être l’une des valeurs du type d’énumération IPPROTO défini dans le fichier d’en-tête Ws2def.h. Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.

Si la valeur 0 est spécifiée, l’appelant ne souhaite pas spécifier de protocole et le fournisseur de services choisit le protocole à utiliser.

Lorsque le paramètre af est AF_INET ou AF_INET6 et que le type est SOCK_RAW, la valeur spécifiée pour le protocole est définie dans le champ de protocole de l’en-tête de paquet IPv6 ou IPv4.

Le tableau ci-dessous répertorie les valeurs courantes pour le protocole , bien que de nombreuses autres valeurs soient possibles.

protocol Signification
IPPROTO_ICMP
1
Protocole ICMP (Internet Control Message Protocol). Il s’agit d’une valeur possible lorsque le paramètre af est AF_UNSPEC, AF_INET ou AF_INET6 et que le paramètre de type est SOCK_RAW ou non spécifié.

Cette valeur de protocole est prise en charge sur Windows XP et versions ultérieures.

IPPROTO_IGMP
2
Protocole IGMP (Internet Group Management Protocol). Il s’agit d’une valeur possible lorsque le paramètre af est AF_UNSPEC, AF_INET ou AF_INET6 et que le paramètre de type est SOCK_RAW ou non spécifié.

Cette valeur de protocole est prise en charge sur Windows XP et versions ultérieures.

BTHPROTO_RFCOMM
3
Protocole Bluetooth Radio Frequency Communications (Bluetooth RFCOMM). Il s’agit d’une valeur possible lorsque le paramètre af est AF_BTH et que le paramètre de type est SOCK_STREAM.

Cette valeur de protocole est prise en charge sur Windows XP avec SP2 ou version ultérieure.

IPPROTO_TCP
6
Protocole TCP (Transmission Control Protocol). Il s’agit d’une valeur possible lorsque le paramètre af est AF_INET ou AF_INET6 et que le paramètre type est SOCK_STREAM.
IPPROTO_UDP
17
Protocole UDP (User Datagram Protocol). Il s’agit d’une valeur possible lorsque le paramètre af est AF_INET ou AF_INET6 et que le paramètre type est SOCK_DGRAM.
IPPROTO_ICMPV6
58
Protocole ICMPv6 (Internet Control Message Protocol Version 6). Il s’agit d’une valeur possible lorsque le paramètre af est AF_UNSPEC, AF_INET ou AF_INET6 et que le paramètre de type est SOCK_RAW ou non spécifié.

Cette valeur de protocole est prise en charge sur Windows XP et versions ultérieures.

IPPROTO_RM
113
Protocole PGM pour une multidiffusion fiable. Il s’agit d’une valeur possible lorsque le paramètre af est AF_INET et que le paramètre de type est SOCK_RDM. Sur le SDK Windows publié pour Windows Vista et versions ultérieures, ce protocole est également appelé IPPROTO_PGM.

Cette valeur de protocole n’est prise en charge que si le protocole Reliable Multicast Est installé.

[in] lpProtocolInfo

Pointeur vers une structure WSAPROTOCOL_INFO qui définit les caractéristiques du socket à créer. Si ce paramètre n’est pas NULL, le socket est lié au fournisseur associé à la structure WSAPROTOCOL_INFO indiquée.

[in] g

UN ID de groupe de sockets existant ou une action appropriée à effectuer lors de la création d’un socket et d’un nouveau groupe de sockets.

Si g est un ID de groupe de sockets existant, joignez le nouveau socket à ce groupe de sockets, à condition que toutes les exigences définies par ce groupe soient remplies.

Si g n’est pas un ID de groupe de sockets existant, les valeurs suivantes sont possibles.

g Signification
0
Aucune opération de groupe n’est effectuée.
SG_UNCONSTRAINED_GROUP
0x01
Créez un groupe de sockets sans contrainte et faites en que le nouveau socket soit le premier membre. Pour un groupe sans contrainte, Winsock ne contraint pas tous les sockets du groupe de sockets à avoir été créés avec la même valeur pour les paramètres de type et de protocole .
SG_CONSTRAINED_GROUP
0x02
Créez un groupe de sockets contraints et faites en que le nouveau socket soit le premier membre. Pour un groupe de sockets contraint, Winsock contraint tous les sockets du groupe de sockets à avoir été créés avec la même valeur pour les paramètres de type et de protocole . Un groupe de sockets contraint peut se composer uniquement de sockets orientés connexion, et nécessite que les connexions sur tous les sockets groupés soient à la même adresse sur le même hôte.
 
Note Les constantes SG_UNCONSTRAINED_GROUP et SG_CONSTRAINED_GROUP ne sont actuellement pas définies dans un fichier d’en-tête public.
 

[in] dwFlags

Ensemble d’indicateurs utilisés pour spécifier des attributs de socket supplémentaires.

Une combinaison de ces indicateurs peut être définie, bien que certaines combinaisons ne soient pas autorisées.

Valeur Signification
WSA_FLAG_OVERLAPPED
0x01
Créez un socket qui prend en charge les opérations d’E/S qui se chevauchent.

La plupart des sockets doivent être créés avec cet indicateur défini. Les sockets superposés peuvent utiliser WSASend, WSASendTo, WSARecv, WSARecvFrom et WSAIoctl pour les opérations d’E/S qui se chevauchent, ce qui permet à plusieurs opérations d’être lancées et en cours simultanément.

Toutes les fonctions qui autorisent les opérations superposées (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) prennent également en charge l’utilisation non superposée sur un socket superposé si les valeurs des paramètres liés aux opérations superposées sont NULL.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Créez un socket qui sera un c_root dans une session multipoint.

Cet attribut n’est autorisé que si la structure WSAPROTOCOL_INFO pour le fournisseur de transport qui crée le socket prend en charge un mécanisme multipoint ou multidiffusion et si le plan de contrôle d’une session multipoint est rooté. Cela est indiqué par le membre dwServiceFlags1 de la structure WSAPROTOCOL_INFO avec les indicateurs XP1_SUPPORT_MULTIPOINT et XP1_MULTIPOINT_CONTROL_PLANE définis.

Lorsque le paramètre lpProtocolInfo n’est pas NULL, la structure WSAPROTOCOL_INFO du fournisseur de transport est pointée vers le paramètre lpProtocolInfo . Lorsque le paramètre lpProtocolInfo a la valeur NULL, la structure WSAPROTOCOL_INFO est basée sur le fournisseur de transport sélectionné par les valeurs spécifiées pour les paramètres af, type et protocole .

Pour plus d’informations sur une session multipoint, consultez Sémantique multipoint et multidiffusion .

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Créez un socket qui sera un c_leaf dans une session multipoint.

Cet attribut n’est autorisé que si la structure WSAPROTOCOL_INFO pour le fournisseur de transport qui crée le socket prend en charge un mécanisme multipoint ou multidiffusion et si le plan de contrôle d’une session multipoint n’est pas rooté. Cela est indiqué par le membre dwServiceFlags1 de la structure WSAPROTOCOL_INFO avec l’indicateur XP1_SUPPORT_MULTIPOINT défini et l’indicateur XP1_MULTIPOINT_CONTROL_PLANE non défini.

Lorsque le paramètre lpProtocolInfo n’est pas NULL, la structure WSAPROTOCOL_INFO du fournisseur de transport est pointée vers le paramètre lpProtocolInfo . Lorsque le paramètre lpProtocolInfo a la valeur NULL, la structure WSAPROTOCOL_INFO est basée sur le fournisseur de transport sélectionné par les valeurs spécifiées pour les paramètres af, type et protocole .

Pour plus d’informations sur une session multipoint, consultez Sémantique multipoint et multidiffusion .

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Créez un socket qui sera un d_root dans une session multipoint.

Cet attribut n’est autorisé que si la structure WSAPROTOCOL_INFO pour le fournisseur de transport qui crée le socket prend en charge un mécanisme multipoint ou multidiffusion et si le plan de données d’une session multipoint est rooté. Cela est indiqué par le membre dwServiceFlags1 de la structure WSAPROTOCOL_INFO avec les indicateurs XP1_SUPPORT_MULTIPOINT et XP1_MULTIPOINT_DATA_PLANE définis.

Lorsque le paramètre lpProtocolInfo n’est pas NULL, la structure WSAPROTOCOL_INFO du fournisseur de transport est pointée vers le paramètre lpProtocolInfo . Lorsque le paramètre lpProtocolInfo a la valeur NULL, la structure WSAPROTOCOL_INFO est basée sur le fournisseur de transport sélectionné par les valeurs spécifiées pour les paramètres af, type et protocole .

Pour plus d’informations sur une session multipoint, consultez Sémantique multipoint et multidiffusion .

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Créez un socket qui sera un d_leaf dans une session multipoint.

Cet attribut n’est autorisé que si la structure WSAPROTOCOL_INFO pour le fournisseur de transport qui crée le socket prend en charge un mécanisme multipoint ou multidiffusion et si le plan de données d’une session multipoint n’est pas rooté. Cela est indiqué par le membre dwServiceFlags1 de la structure WSAPROTOCOL_INFO avec l’indicateur XP1_SUPPORT_MULTIPOINT défini et l’indicateur XP1_MULTIPOINT_DATA_PLANE non défini.

Lorsque le paramètre lpProtocolInfo n’est pas NULL, la structure WSAPROTOCOL_INFO du fournisseur de transport est pointée vers le paramètre lpProtocolInfo . Lorsque le paramètre lpProtocolInfo a la valeur NULL, la structure WSAPROTOCOL_INFO est basée sur le fournisseur de transport sélectionné par les valeurs spécifiées pour les paramètres af, type et protocole .

Pour plus d’informations sur une session multipoint, consultez Sémantique multipoint et multidiffusion .

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Créez un socket qui permet de définir un descripteur de sécurité sur le socket qui contient une liste de contrôle d’accès de sécurité (SACL) au lieu d’une simple liste de contrôle d’accès discrétionnaire (DACL).

Les SACL sont utilisés pour générer des audits et des alarmes lorsqu’un case activée d’accès se produit sur l’objet. Pour un socket, un case activée d’accès se produit pour déterminer si le socket doit être autorisé à être lié à une adresse spécifique spécifiée à la fonction de liaison.

Le droit d’accès ACCESS_SYSTEM_SECURITY contrôle la possibilité d’obtenir ou de définir la SACL dans le descripteur de sécurité d’un objet. Le système accorde ce droit d’accès uniquement si le privilège SE_SECURITY_NAME est activé dans le jeton d’accès du thread demandeur.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Créez un socket qui ne peut pas être hérité.

Un handle de socket créé par la fonction WSASocket ou socket peut être hérité par défaut. Lorsque cet indicateur est défini, le handle de socket ne peut pas être hérité.

La fonction GetHandleInformation peut être utilisée pour déterminer si un handle de socket a été créé avec l’indicateur WSA_FLAG_NO_HANDLE_INHERIT défini. La fonction GetHandleInformation retourne que la valeur HANDLE_FLAG_INHERIT est définie.

Cet indicateur est pris en charge sur Windows 7 avec SP1, Windows Server 2008 R2 avec SP1 et versions ultérieures

 
Important Pour les sockets multipoints, un seul indicateur WSA_FLAG_MULTIPOINT_C_ROOT ou WSA_FLAG_MULTIPOINT_C_LEAF peut être spécifié, et un seul indicateur WSA_FLAG_MULTIPOINT_D_ROOT ou WSA_FLAG_MULTIPOINT_D_LEAF peut être spécifié. Pour plus d’informations, consultez Sémantique multipoint et multidiffusion .
 

Valeur retournée

Si aucune erreur ne se produit, WSASocket retourne un descripteur référençant le nouveau socket. Sinon, une valeur de INVALID_SOCKET est retournée et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Note Cette description du code d’erreur est propre à Microsoft.
 
Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEAFNOSUPPORT
La famille d’adresses spécifiée n’est pas prise en charge.
WSAEFAULT
Le paramètre lpProtocolInfo ne se trouve pas dans une partie valide de l’espace d’adressage du processus.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEINVAL
Cette valeur est true pour l’une des conditions suivantes.
  • Le paramètre g spécifié n’est pas valide.
  • La structure WSAPROTOCOL_INFO vers laquelle lpProtocolInfo pointe est incomplète, le contenu n’est pas valide ou la structure WSAPROTOCOL_INFO a déjà été utilisée dans une opération de socket en double antérieure.
  • Les valeurs spécifiées pour les membres du socket triple <af, du type et du protocole> sont prises en charge individuellement, mais la combinaison donnée ne l’est pas.
WSAEINVALIDPROVIDER
Le fournisseur de services a retourné une version autre que 2.2.
WSAEINVALIDPROCTABLE
Le fournisseur de services a retourné une table de procédure non valide ou incomplète à WSPStartup.
WSAEMFILE
Aucun descripteur de socket supplémentaire n'est disponible.
WSAENOBUFS
Aucune zone tampon disponible. Impossible de créer le socket.
WSAEPROTONOSUPPORT
Le protocole spécifié n'est pas pris en charge.
WSAEPROTOTYPE
Le protocole spécifié est le type incorrect pour ce socket.
WSAEPROVIDERFAILEDINIT
Le fournisseur de services n’a pas pu s’initialiser. Cette erreur est retournée si un fournisseur de services en couches (LSP) ou un fournisseur d’espaces de noms n’a pas été correctement installé ou si le fournisseur ne fonctionne pas correctement.
WSAESOCKTNOSUPPORT
Le type de socket spécifié n’est pas pris en charge dans cette famille d’adresses.

Remarques

La fonction WSASocket entraîne l’allocation et l’association d’un descripteur de socket et de toutes les ressources associées à un fournisseur de services de transport. La plupart des sockets doivent être créés avec l’attribut WSA_FLAG_OVERLAPPED défini dans le paramètre dwFlags . Un socket créé avec cet attribut prend en charge l’utilisation d’opérations d’E/S superposées qui offrent des performances plus élevées. Par défaut, un socket créé avec la fonction WSASocket n’aura pas cet ensemble d’attributs superposés. En revanche, la fonction socket crée un socket qui prend en charge les opérations d’E/S superposées comme comportement par défaut.

Si le paramètre lpProtocolInfo a la valeur NULL, Winsock utilise le premier fournisseur de services de transport disponible qui prend en charge la combinaison demandée de famille d’adresses, de type de socket et de protocole spécifiée dans les paramètres af, type et protocole .

Si le paramètre lpProtocolInfo n’est pas NULL, le socket est lié au fournisseur associé à la structure WSAPROTOCOL_INFO indiquée. Dans cette instance, l’application peut fournir la constante manifeste FROM_PROTOCOL_INFO comme valeur pour n’importe quel paramètre af, type ou protocole. Cela indique que les valeurs correspondantes de la structure WSAPROTOCOL_INFO indiquée (iAddressFamily, iSocketType, iProtocol) doivent être supposées. Dans tous les cas, les valeurs spécifiées pour af, type et protocole sont passées sans modification au fournisseur de services de transport.

Lors de la sélection d’un protocole et de son fournisseur de services de prise en charge en fonction de af, de type et de protocole, cette procédure ne choisit qu’un protocole de base ou une chaîne de protocole, et non une couche de protocole par elle-même. Les couches de protocole non chaînées ne sont pas considérées comme ayant des correspondances partielles sur type ou af. Autrement dit, ils n’entraînent pas un code d’erreur WSAEAFNOSUPPORT ou WSAEPROTONOSUPPORT, si aucun protocole approprié n’est trouvé.

Note La constante manifeste AF_UNSPEC continue d’être définie dans le fichier d’en-tête, mais son utilisation est fortement déconseillée, car cela peut entraîner une ambiguïté dans l’interprétation de la valeur du paramètre de protocole .
 
Les applications sont encouragées à utiliser AF_INET6 pour le paramètre af et à créer un socket double mode qui peut être utilisé avec IPv4 et IPv6.

Si un socket est créé à l’aide de la fonction WSASocket , le paramètre dwFlags doit avoir l’attribut WSA_FLAG_OVERLAPPED défini pour que les options de socket SO_RCVTIMEO ou SO_SNDTIMEO fonctionnent correctement. Sinon, le délai d’expiration ne prend jamais effet sur le socket.

Les sockets orientés connexion tels que les SOCK_STREAM fournissent des connexions duplex complètes et doivent être dans un état connecté avant que des données puissent être envoyées ou reçues sur eux. Une connexion à un socket spécifié est établie avec un appel de fonction connect ou WSAConnect . Une fois connectées, les données peuvent être transférées à l’aide d’appels/WSASend et recv/WSARecv . Lorsqu’une session est terminée, la fonction closesocket doit être appelée pour libérer les ressources associées au socket. Pour les sockets orientés connexion, la fonction d’arrêt doit être appelée pour arrêter le transfert de données sur le socket avant d’appeler la fonction closesocket .

Les protocoles de communication utilisés pour implémenter un socket fiable orienté connexion garantissent que les données ne sont pas perdues ou dupliquées. Si les données pour lesquelles le protocole homologue dispose d’un espace de mémoire tampon ne peuvent pas être transmises correctement dans un délai raisonnable, la connexion est considérée comme interrompue et les appels suivants échouent avec le code d’erreur défini sur WSAETIMEDOUT.

Les sockets orientés message sans connexion permettent l’envoi et la réception de datagrammes vers et depuis des homologues arbitraires à l’aide de sendto/WSASendTo et de recvfrom/WSARecvFrom. Si un tel socket est connecté à un homologue spécifique, les datagrammes peuvent être envoyés à cet homologue à l’aide d’envoyer/WSASend et peuvent être reçus de (uniquement) cet homologue à l’aide de recv/WSARecv.

La prise en charge des sockets de type SOCK_RAW n’est pas requise, mais les fournisseurs de services sont encouragés à prendre en charge les sockets bruts dans la mesure du possible.

La fonction WSASocket peut être utilisée pour créer un socket à utiliser par un service, de sorte que, si un autre socket tente de se lier au même port utilisé par le service, l’enregistrement d’audit est généré. Pour activer cette option, une application doit effectuer les opérations suivantes :

  • Appelez la fonction AdjustTokenPrivileges pour activer le privilège SE_SECURITY_NAME dans le jeton d’accès du processus. Ce privilège est requis pour définir les droits d’accès ACCESS_SYSTEM_SECURITY sur le descripteur de sécurité d’un objet.
  • Appelez la fonction WSASocket pour créer un socket avec dwFlag avec l’option WSA_FLAG_ACCESS_SYSTEM_SECURITY définie. La fonction WSASocket échoue si la fonction AdjustTokenPrivileges n’est pas appelée en premier pour activer le privilège SE_SECURITY_NAME nécessaire à cette opération.
  • Appelez la fonction SetSecurityInfo pour définir un descripteur de sécurité avec une liste de Access Control système (SACL) sur le socket. Le handle de socket retourné par la fonction WSASocket est passé dans le paramètre handle . Si la fonction réussit, cela définit le droit d’accès ACCESS_SYSTEM_SECURITY sur le descripteur de sécurité pour le socket.
  • Appelez la fonction bind pour lier le socket à un port spécifique. Si la fonction de liaison réussit, une entrée d’audit est générée si un autre socket tente de lier au même port.
  • Appelez la fonction AdjustTokenPrivileges pour supprimer le privilège SE_SECURITY_NAME dans le jeton d’accès du processus, car cela n’est plus nécessaire.

Pour plus d’informations sur ACCESS_SYSTEM_SECURITY, consultez Droits d’accès SACL et Génération d’audit dans la documentation sur l’autorisation.

Groupes de sockets

WinSock 2 a introduit la notion de groupe de sockets comme moyen pour une application, ou un ensemble d’applications coopérant, pour indiquer à un fournisseur de services sous-jacent qu’un ensemble particulier de sockets est lié et que le groupe ainsi formé possède certains attributs. Les attributs de groupe incluent les priorités relatives des sockets individuels au sein du groupe et une spécification de qualité de service de groupe.

Les applications qui ont besoin d’échanger des flux multimédias sur le réseau sont un exemple où la possibilité d’établir une relation spécifique entre un ensemble de sockets peut être bénéfique. Il dépend du transport sur la façon de traiter les groupes de sockets.

Les fonctions WSASocket et WSAAccept peuvent être utilisées pour créer et joindre explicitement un groupe de sockets lors de la création d’un socket. L’ID de groupe de sockets pour un socket peut être récupéré à l’aide de la fonction getsockopt avec le paramètre de niveau défini sur SOL_SOCKET et le paramètre optname défini sur SO_GROUP_ID. Un groupe de sockets et son ID de groupe de sockets associés restent valides jusqu’à ce que le dernier socket appartenant à ce groupe de sockets soit fermé. Les ID de groupe de sockets sont uniques dans tous les processus d’un fournisseur de services donné. Un groupe de sockets de zéro indique que le socket n’est pas membre d’un groupe de sockets.

La priorité de groupe relative d’un groupe de sockets est accessible à l’aide de la fonction getsockopt avec le paramètre level défini sur SOL_SOCKET et le paramètre optname défini sur SO_GROUP_PRIORITY. La priorité de groupe relative d’un groupe de sockets peut être définie à l’aide de setsockopt avec le paramètre level défini sur SOL_SOCKET et le paramètre optname défini sur SO_GROUP_PRIORITY.

Le fournisseur Winsock inclus dans Windows permet la création de groupes de sockets et applique la SG_CONSTRAINED_GROUP. Tous les sockets d’un groupe de sockets contraints doivent être créés avec la même valeur pour les paramètres de type et de protocole . Un groupe de sockets contraint peut se composer uniquement de sockets orientés connexion, et nécessite que les connexions sur tous les sockets groupés soient à la même adresse sur le même hôte. Il s’agit de la seule restriction appliquée à un groupe de sockets par le fournisseur Winsock inclus dans Windows. La priorité du groupe de sockets n’est actuellement pas utilisée par le fournisseur Winsock ou la pile TCP/IP incluse avec Windows.

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction WSASocket .
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8 : la fonction WSASocketW est prise en charge pour les applications Windows Phone Store sur Windows Phone 8 et versions ultérieures.

Windows 8.1 et Windows Server 2012 R2 : la fonction WSASocketW est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Notes

L’en-tête winsock2.h définit WSASocket en tant qu’alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. La combinaison de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock2.h
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSAPROTOCOL_INFO

Winsock Functions

Référence Winsock

Accepter

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

envoyer

Sendto

setsockopt

shutdown

socket