Partager via


setockopt, fonction (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 au sein du niveau spécifié, ou 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 par le paramètre optval .

Valeur de retour

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 Meaning
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 n’est pas dans une partie valide de l’espace d’adressage du processus ou le paramètre optlen est trop petit.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant 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 de la mémoire tampon pointées par le paramètre optval ne sont pas valides.
WSAENETRESET
La connexion a expiré lorsque SO_KEEPALIVE est définie.
WSAENOPROTOOPT
L’option est inconnue ou non prise en charge pour le fournisseur ou le socket spécifié (voir SO_GROUP_PRIORITY limitations).
WSAENOTCONN
La connexion a été réinitialisée lorsque SO_KEEPALIVE est définie.
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 du socket le plus élevé. Les options affectent les opérations de socket, telles que 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 les 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’a pas lieu. Dans ce cas, l’appel de fonction setsockopt réussit toujours, mais l’appel de fonction de liaison peut échouer en raison d’un échec d’appel setockopt précoce.
 
Note Si un socket est ouvert, un appel setockopt 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 ou une structure entière. 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 aux sizeof(int) options booléennes. Pour d’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 de socket. Pour obtenir des listes plus complètes d’options de socket et des informations plus détaillées (valeurs par défaut, par exemple), consultez les rubriques détaillées sous Options de socket.

niveau = SOL_SOCKET

Valeur Type Descriptif
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. Actuellement, les fournisseurs Microsoft ne génèrent aucune information de débogage.
SO_DONTLINGER BOOL Ne bloque pas la fermeture en attente de l’envoi de données non envoyées. La définition de 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 à une route 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 Lingers à la fermeture si des données non contenues sont présentes.
SO_OOBINLINE BOOL Indique que les données hors limites doivent être retournées en ligne avec des données régulières. Cette option est valide uniquement pour les protocoles orientés connexion qui prennent en charge les données hors bande. Pour une discussion sur cette rubrique, consultez Les données hors bande indépendantes du protocole.
SO_RCVBUF int Spécifie l’espace tampon total par socket réservé aux réceptions.
SO_REUSEADDR BOOL Permet au socket d’être lié à une adresse déjà utilisée. Pour plus d’informations, consultez liaison. Non applicable sur les sockets ATM.
SO_EXCLUSIVEADDRUSE BOOL Permet à un socket d’être lié pour un accès exclusif. Ne nécessite pas de privilèges administratifs.
SO_RCVTIMEO DWORD Définit le délai d’expiration, en millisecondes, pour bloquer les appels de réception.
SO_SNDBUF int Spécifie l’espace tampon total par socket réservé aux envois.
SO_SNDTIMEO DWORD Délai d’expiration, en millisecondes, pour bloquer les appels d’envoi.
SO_UPDATE_ACCEPT_CONTEXT UINT_PTR Met à jour le socket accepté 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 plus d’informations complètes et détaillées sur les options de socket pour lesSOL_SOCKETde niveau = , consultez SOL_SOCKET Options de socket.

niveau = IPPROTO_TCP

Consultez TCP_NODELAY dans les 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_TCPde niveau = .

niveau = NSPROTO_IPX

Valeur Type Descriptif
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 probablement 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 améliorer les performances du système.
IPX_IMMEDIATESPXACK BOOL Dirige les connexions SPX à ne pas retarder avant d’envoyer un ACK. Les applications sans trafic arrière et arrière doivent définir cette valeur sur TRUE pour augmenter les performances.
 

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

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

Valeur Type Descriptif
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 le paramètre 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 la fin de l’appel. 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 relatives aux 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 Meaning
    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 locale. 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 les informations basées sur IrDA. L’accès limité à la base de données IAS est disponible via l’interface Windows Sockets 2, mais cet accès n’est pas normalement utilisé par les applications et existe principalement pour prendre en charge les connexions à des appareils non-Windows qui ne sont pas conformes aux conventions IrDA Windows Sockets 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 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.

Spécifications

Requirement Valeur
Client minimum requis 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 Fenêtres
Header winsock.h (inclure Winsock2.h)
Library 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

Fonctions Winsock

lier

getsockopt

ioctlsocket

prise