Partager via


Fonction socket (winsock2.h)

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

Syntaxe

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

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 la SDK Windows publiée 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
Le 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 de 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 de 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 de multidiffusion fiable est installé.

Valeur retournée

Si aucune erreur ne se produit, socket 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.

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 ou le fournisseur de services associé a échoué.
WSAEAFNOSUPPORT
La famille d’adresses spécifiée n’est pas prise en charge. Par exemple, une application a essayé de créer un socket pour la famille d’adresses AF_IRDA , mais un adaptateur infrarouge et un pilote de périphérique ne sont pas installés sur l’ordinateur local.
WSAEINPROGRESS
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEMFILE
Aucun descripteur de socket supplémentaire n'est disponible.
WSAEINVAL
Argument non valide fourni. Cette erreur est retournée si le paramètre af est défini sur AF_UNSPEC et si le type et le paramètre de protocole ne sont pas spécifiés.
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.
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
Échec de l’initialisation du fournisseur de services. Cette erreur est retournée si un fournisseur de services en couche (LSP) ou un fournisseur d’espaces de noms n’a pas été installé correctement 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 socket entraîne l’allocation et la liaison d’un descripteur de socket et de toutes les ressources associées à un fournisseur de services de transport spécifique. Winsock utilise le premier fournisseur de services disponible qui prend en charge la combinaison demandée de famille d’adresses, de type de socket et de paramètres de protocole. Le socket créé aura l’attribut superposé comme valeur par défaut. Pour Windows, l’option de socket spécifique à Microsoft, SO_OPENTYPE, définie dans Mswsock.h peut affecter cette valeur par défaut. Consultez la documentation spécifique à Microsoft pour obtenir une description détaillée de SO_OPENTYPE.

Les sockets sans l’attribut superposé peuvent être créés à l’aide de WSASocket. Toutes les fonctions qui autorisent les opérations qui se chevauchent (WSASend, WSARecv, WSASendTo, WSARecvFrom et WSAIoctl) prennent également en charge l’utilisation non superposée sur un socket qui se chevauche si les valeurs des paramètres liés à l’opération qui se chevauchent sont NULL.

Lors de la sélection d’un protocole et de son fournisseur de services de prise en charge, cette procédure ne choisit qu’un protocole de base ou une chaîne de protocole, et non une couche de protocole en elle-même. Les couches de protocole non chaînées ne sont pas considérées comme ayant des correspondances partielles sur le type ou af . Autrement dit, ils ne conduisent 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.

Les sockets orientés connexion, tels que les SOCK_STREAM fournissent des connexions duplex complètes, et doivent être connectés avant d’envoyer ou de recevoir des données. Une connexion à un autre socket est créée avec un appel de connexion . Une fois connectées, les données peuvent être transférées à l’aide d’appels d’envoi et de récurrence. Une fois une session terminée, une fermeture doit être effectuée.

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 et de recvfrom. Si un tel socket est connecté à un homologue spécifique, les datagrammes peuvent être envoyés à cet homologue à l’aide de l’option send et ne peuvent être reçus que de cet homologue à l’aide de recv.

IPv6 et IPv4 fonctionnent différemment lors de la réception d’un socket avec un typede SOCK_RAW. Le paquet de réception IPv4 inclut la charge utile du paquet, l’en-tête de niveau supérieur suivant (par exemple, l’en-tête IP d’un paquet TCP ou UDP) et l’en-tête de paquet IPv4. Le paquet de réception IPv6 inclut la charge utile du paquet et l’en-tête de niveau supérieur suivant. Le paquet de réception IPv6 n’inclut jamais l’en-tête de paquet IPv6.

Note Sur Windows NT, la prise en charge des sockets bruts nécessite des privilèges d’administration.
 
Un socket avec un paramètre de typeSOCK_SEQPACKET est basé sur des datagrammes, mais fonctionne comme un protocole de pseudo-flux. Pour les paquets d’envoi et de réception, des datagrammes distincts sont utilisés. Toutefois, les sockets Windows peuvent fusionner plusieurs paquets de réception en un seul paquet. Ainsi, une application peut émettre un appel de réception (par exemple, recv ou WSARecvEx) et récupérer les données de plusieurs paquets coalescés en un seul appel. La famille d’adresses AF_NETBIOS prend en charge un paramètre de typeSOCK_SEQPACKET.

Lorsque le paramètre af est AF_NETBIOS pour NetBIOS via TCP/IP, le paramètre de type peut être SOCK_DGRAM ou SOCK_SEQPACKET. Pour la famille d’adresses AF_NETBIOS , le paramètre de protocole est le numéro d’adaptateur LAN représenté sous la forme d’un nombre négatif.

Sur Windows XP et versions ultérieures, la commande suivante peut être utilisée pour répertorier le catalogue des sockets Windows afin de déterminer les fournisseurs de services installés et la famille d’adresses, le type de socket et les protocoles pris en charge.

netsh winsock show catalog

La prise en charge des sockets de type SOCK_RAW n’est pas obligatoire, mais les fournisseurs de services sont encouragés à prendre en charge les sockets bruts comme possible.

Remarques pour les sockets IrDA

N'oubliez pas les éléments suivants :
  • Le fichier d’en-tête Af_irda.h doit être inclus explicitement.
  • Seul SOCK_STREAM est pris en charge ; le type SOCK_DGRAM n’est pas pris en charge par IrDA.
  • Le paramètre de protocole est toujours défini sur 0 pour IrDA.
Un socket à utiliser avec la famille d’adresses AF_IRDA ne peut être créé que si un port infrarouge et un pilote sont installés sur l’ordinateur local. Sinon, un appel à la fonction socket avec le paramètre af défini sur AF_IRDA échoue et WSAGetLastError retourne WSAEPROTONOSUPPORT.

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction socket pour créer un socket lié à un fournisseur de services de transport spécifique.
#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;

    // Validate the parameters
    if (argc != 4) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
        wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    
    // 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);

    sock = socket(iFamily, iType, iProtocol);
    if (sock == INVALID_SOCKET) 
        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }

    WSACleanup();

    return 0;
}


Windows Phone 8 : cette fonction 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 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

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

IPPROTO_IP Socket Options

IPPROTO_IPV6 Socket Options

Programmation multidiffusion fiable

WSASocket

Winsock Functions

Référence Winsock

Accepter

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

envoyer

Sendto

setsockopt

shutdown