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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. | |
Le sous-système réseau a échoué. | |
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. | |
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel. | |
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. | |
Le délai de connexion a expiré lorsque SO_KEEPALIVE est défini. | |
L’option est inconnue ou non prise en charge pour le fournisseur ou le socket spécifié (voir limitations SO_GROUP_PRIORITY). | |
La connexion a été réinitialisée lorsque SO_KEEPALIVE est défini. | |
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.
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. |
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. |
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 |