fonction setsockopt (winsock.h)

La fonction setsockopt définit une option de socket.

Syntaxe

int setsockopt(
  [in] SOCKET     s,
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);

Paramètres

[in] s

Descripteur qui identifie un socket.

[in] level

Niveau auquel l’option est définie (par exemple, SOL_SOCKET).

[in] optname

Option de socket pour laquelle la valeur doit être définie (par exemple, SO_BROADCAST). Le paramètre optname doit être une option de socket définie dans le niveau spécifié, sinon le comportement n’est pas défini.

[in] optval

Pointeur vers la mémoire tampon dans laquelle la valeur de l’option demandée est spécifiée.

[in] optlen

Taille, en octets, de la mémoire tampon pointée vers le paramètre optval .

Valeur retournée

Si aucune erreur ne se produit, setsockopt retourne zéro. Sinon, une valeur de SOCKET_ERROR 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 a échoué.
WSAEFAULT
La mémoire tampon pointée par le paramètre optval ne se trouve pas dans une partie valide de l’espace d’adressage du processus ou le paramètre optlen est trop petit.
WSAEINPROGRESS
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEINVAL
Le paramètre de niveau n’est pas valide ou les informations contenues dans la mémoire tampon pointée par le paramètre optval ne sont pas valides.
WSAENETRESET
Le délai de connexion a expiré lorsque SO_KEEPALIVE est défini.
WSAENOPROTOOPT
L’option est inconnue ou non prise en charge pour le fournisseur ou le socket spécifié (voir limitations SO_GROUP_PRIORITY).
WSAENOTCONN
La connexion a été réinitialisée lorsque SO_KEEPALIVE est défini.
WSAENOTSOCK
Le descripteur n’est pas un socket.

Remarques

La fonction setsockopt définit la valeur actuelle d’une option de socket associée à un socket de n’importe quel type, dans n’importe quel état. Bien que les options puissent exister à plusieurs niveaux de protocole, elles sont toujours présentes au niveau de socket le plus haut. Les options affectent les opérations de socket, par exemple si les données accélérées (données OOB, par exemple) sont reçues dans le flux de données normal et si des messages de diffusion peuvent être envoyés sur le socket.

Note Si la fonction setsockopt est appelée avant la fonction de liaison , les options TCP/IP ne sont pas vérifiées à l’aide de TCP/IP tant que la liaison n’est pas effectuée. Dans ce cas, l’appel de la fonction setsockopt réussit toujours, mais l’appel de fonction de liaison peut échouer en raison d’un appel de setsockopt précoce.
 
Note Si un socket est ouvert, un appel setsockopt est effectué, puis un appel sendto est effectué, Windows Sockets effectue un appel de fonction de liaison implicite.
 
Il existe deux types d’options de socket : les options booléennes qui activent ou désactivent une fonctionnalité ou un comportement, et les options qui nécessitent une valeur entière ou une structure. Pour activer une option booléenne, le paramètre optval pointe vers un entier différent de zéro. Pour désactiver l’option optval pointe vers un entier égal à zéro. Le paramètre optlen doit être égal à sizeof(int) pour les options booléennes. Pour les autres options, optval pointe vers un entier ou une structure qui contient la valeur souhaitée pour l’option, et optlen est la longueur de l’entier ou de la structure.

Les tableaux suivants répertorient certaines des options courantes prises en charge par la fonction setsockopt . La colonne Type identifie le type de données traitées par le paramètre optval . La colonne Description fournit des informations de base sur l’option socket. Pour obtenir des listes plus complètes d’options de socket et des informations plus détaillées (par exemple, les valeurs par défaut), consultez les rubriques détaillées sous Options de socket.

Niveau = SOL_SOCKET

Valeur Type Description
SO_BROADCAST BOOL Configure un socket pour l’envoi de données de diffusion.
SO_CONDITIONAL_ACCEPT BOOL Permet aux connexions entrantes d’être acceptées ou rejetées par l’application, et non par la pile de protocoles.
SO_DEBUG BOOL Active la sortie de débogage. Les fournisseurs Microsoft ne génèrent actuellement aucune information de débogage.
SO_DONTLINGER BOOL Ne bloque pas la fermeture en attendant l’envoi des données non envoyées. Définir cette option équivaut à définir SO_LINGER avec l_onoff défini sur zéro.
SO_DONTROUTE BOOL Définit si les données sortantes doivent être envoyées sur l’interface à laquelle le socket est lié et non pas routé sur une autre interface. Cette option n’est pas prise en charge sur les sockets ATM (entraîne une erreur).
SO_GROUP_PRIORITY int Réservé.
SO_KEEPALIVE BOOL Permet d’envoyer des paquets keep-alive pour une connexion de socket. Non pris en charge sur les sockets ATM (entraîne une erreur).
SO_LINGER S' ATTARDER Ferme si des données nonentes sont présentes.
SO_OOBINLINE BOOL Indique que les données hors limites doivent être retournées en ligne avec les données régulières. Cette option n’est valide que pour les protocoles orientés connexion qui prennent en charge les données hors bande. Pour une discussion sur cette rubrique, consultez Données hors bande indépendantes du protocole.
SO_RCVBUF int Spécifie la quantité totale d'espace de la mémoire tampon réservée aux réceptions par socket.
SO_REUSEADDR BOOL Autorise la liaison du socket à une adresse déjà utilisée. Pour plus d’informations, consultez lier. Non applicable sur les sockets ATM.
SO_EXCLUSIVEADDRUSE BOOL Permet à un socket d'être limité à un accès exclusif. Ne nécessite pas de privilèges d’administration.
SO_RCVTIMEO DWORD Définit le délai d’attente, en millisecondes, pour le blocage des appels de réception.
SO_SNDBUF int Spécifie la quantité totale d'espace de la mémoire tampon réservée aux envois par socket.
SO_SNDTIMEO DWORD Délai d’attente, en millisecondes, pour le blocage des appels d’envoi.
SO_UPDATE_ACCEPT_CONTEXT int Mises à jour le socket d’acceptation avec le contexte du socket d’écoute.
PVD_CONFIG Dépendant du fournisseur de services Cet objet stocke les informations de configuration du fournisseur de services associé aux sockets. Le format exact de cette structure de données est spécifique au fournisseur de services.
  Pour obtenir des informations plus complètes et détaillées sur les options de socket pourles SOL_SOCKETde niveau = , consultez Options de socket SOL_SOCKET.

Niveau = IPPROTO_TCP

Consultez TCP_NODELAY dans options de socket IPPROTO_TCP. Consultez également cette rubrique pour obtenir des informations plus complètes et détaillées sur les options de socket pourles IPPROTO_TCP de niveau = .

Niveau = NSPROTO_IPX

Valeur Type Description
IPX_PTYPE int Définit le type de paquet IPX.
IPX_FILTERPTYPE int Définit le type de paquet de filtre de réception
IPX_STOPFILTERPTYPE int Arrête le filtrage du type de filtre défini avec IPX_FILTERTYPE
IPX_DSTYPE int Définit la valeur du champ de flux de données dans l’en-tête SPX sur chaque paquet envoyé.
IPX_EXTENDED_ADDRESS BOOL Définit si l’adressage étendu est activé.
IPX_RECVHDR BOOL Définit si l’en-tête de protocole est envoyé sur tous les en-têtes de réception.
IPX_RECEIVE_BROADCAST BOOL Indique que les paquets de diffusion sont susceptibles d’être sur le socket. Défini sur TRUE par défaut. Les applications qui n’utilisent pas de diffusions doivent définir cette valeur sur FALSE pour de meilleures performances système.
IPX_IMMEDIATESPXACK BOOL Indique aux connexions SPX de ne pas retarder l’envoi d’un ACK. Les applications sans trafic aller-retour doivent définir cette valeur sur TRUE pour augmenter les performances.
 

Pour obtenir des informations plus complètes et détaillées sur les options de socket pourles NSPROTO_IPXde niveau = , consultez options de socket NSPROTO_IPX.

Les options BSD non prises en charge pour setsockopt sont indiquées dans le tableau suivant.

Valeur Type Description
SO_ACCEPTCONN BOOL Retourne si un socket est en mode d’écoute. Cette option est valide uniquement pour les protocoles orientés connexion. Cette option de socket n’est pas prise en charge pour le paramètre.
SO_RCVLOWAT int Option de socket de BSD UNIX incluse pour la compatibilité descendante. Cette option définit le nombre minimal d’octets à traiter pour les opérations d’entrée de socket.
SO_SNDLOWAT int Option de socket de BSD UNIX incluse pour la compatibilité descendante. Cette option définit le nombre minimal d’octets à traiter pour les opérations de sortie de socket.
SO_TYPE int Retourne le type de socket pour le socket donné (SOCK_STREAM ou SOCK_DGRAM, par exemple Cette option de socket n’est pas prise en charge pour la définition du type de socket.
 
Note Lors de l’émission d’un appel Winsock bloquant tel que setsockopt, Winsock peut avoir besoin d’attendre un événement réseau avant que l’appel ne se termine. Winsock effectue une attente alertable dans cette situation, qui peut être interrompue par un appel de procédure asynchrone (APC) planifié sur le même thread. L’émission d’un autre appel Winsock bloquant à l’intérieur d’un APC qui a interrompu un appel Winsock bloquant en cours sur le même thread entraîne un comportement non défini et ne doit jamais être tenté par les clients Winsock.
 

Exemple de code

L’exemple suivant illustre la fonction setsockopt .
#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

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

int main()
{

    //---------------------------------------
    // Declare variables
    WSADATA wsaData;

    SOCKET ListenSocket;
    sockaddr_in service;

    int iResult = 0;

    BOOL bOptVal = FALSE;
    int bOptLen = sizeof (BOOL);

    int iOptVal = 0;
    int iOptLen = sizeof (int);

    //---------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"Error at WSAStartup()\n");
        return 1;
    }
    //---------------------------------------
    // Create a listening socket
    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;
    }
    //---------------------------------------
    // Bind the socket to the local IP address
    // and port 27015
    hostent *thisHost;
    char *ip;
    u_short port;
    port = 27015;
    thisHost = gethostbyname("");
    ip = inet_ntoa(*(struct in_addr *) *thisHost->h_addr_list);

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(ip);
    service.sin_port = htons(port);

    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;
    }
    //---------------------------------------
    // Initialize variables and call setsockopt. 
    // The SO_KEEPALIVE parameter is a socket option 
    // that makes the socket send keepalive messages
    // on the session. The SO_KEEPALIVE socket option
    // requires a boolean value to be passed to the
    // setsockopt function. If TRUE, the socket is
    // configured to send keepalive messages, if FALSE
    // the socket configured to NOT send keepalive messages.
    // This section of code tests the setsockopt function
    // by checking the status of SO_KEEPALIVE on the socket
    // using the getsockopt function.

    bOptVal = TRUE;

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"setsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"Set SO_KEEPALIVE: ON\n");

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    closesocket(ListenSocket);
    WSACleanup();
    return 0;
}


Remarques pour les sockets IrDA

Lors du développement d’applications à l’aide de sockets Windows pour IrDA, notez les points suivants :

  • Le fichier d’en-tête Af_irda.h doit être inclus explicitement.
  • IrDA fournit l’option de socket suivante :
    Valeur Type Signification
    IRLMP_IAS_SET *IAS_SET Définit les attributs IAS
     

L’option de socket IRLMP_IAS_SET permet à l’application de définir un attribut unique d’une classe unique dans l’IAS local. L’application spécifie la classe à définir, l’attribut et le type d’attribut. L’application est censée allouer une mémoire tampon de la taille nécessaire pour les paramètres passés.

IrDA fournit une base de données IAS qui stocke des informations basées sur IrDA. Un accès limité à la base de données IAS est disponible via l’interface Windows Sockets 2, mais cet accès n’est normalement pas utilisé par les applications et il existe principalement pour prendre en charge les connexions à des appareils non Windows qui ne sont pas conformes aux conventions IrDA des sockets Windows 2.

La structure suivante, IAS_SET, est utilisée avec l’option IRLMP_IAS_SET setsockopt pour gérer la base de données IAS locale :


// #include <Af_irda.h> for this struct

typedef struct _IAS_SET {
    u_char      irdaClassName[IAS_MAX_CLASSNAME];
    char      irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long    irdaAttribType;
    union
    {
              LONG irdaAttribInt;
              struct
              {
                   u_long   Len;
                   u_char    OctetSeq[IAS_MAX_OCTET_STRING];
              } irdaAttribOctetSeq;
              struct
              {
                   u_long    Len;
                   u_long    CharSet;
                   u_char    UsrStr[IAS_MAX_USER_STRING];
              } irdaAttribUsrStr;
    } irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIASSET;

La structure suivante, IAS_QUERY, est utilisée avec l’option IRLMP_IAS_QUERY setsockopt pour interroger la base de données IAS d’un homologue :


// #include <Af_irda.h> for this struct

typedef struct _WINDOWS_IAS_QUERY {
        u_char   irdaDeviceID[4];
        char     irdaClassName[IAS_MAX_CLASSNAME];
        char     irdaAttribName[IAS_MAX_ATTRIBNAME];
        u_long   irdaAttribType;
        union
        {
                  LONG    irdaAttribInt;
                  struct
                  {
                          u_long  Len;
                          u_char  OctetSeq[IAS_MAX_OCTET_STRING];
                  } irdaAttribOctetSeq;
                  struct
                  {
                          u_long  Len;
                          u_long  CharSet;
                          u_char  UsrStr[IAS_MAX_USER_STRING];
                  } irdaAttribUsrStr;
        } irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIASQUERY;

De nombreuses options de socket de niveau SO_ ne sont pas significatives pour IrDA. Seule SO_LINGER est spécifiquement prise en charge.

Windows Phone 8 : cette fonction est prise en charge pour les applications du Store Windows Phone 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

   
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 winsock.h (inclure Winsock2.h)
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

IPPROTO_IP Socket Options

IPPROTO_IPV6 Socket Options

IPPROTO_RM Socket Options

IPPROTO_TCP Socket Options

IPPROTO_UDP Socket Options

NSPROTO_IPX Socket Options

SOL_APPLETALK Socket Options

SOL_IRLMP Socket Options

SOL_SOCKET Socket Options

Socket Options

WSAAsyncSelect

WSAEventSelect

WSAIoctl

Winsock Functions

bind

getsockopt

ioctlsocket

socket