Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 |
|---|---|
| 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 n’est pas dans une partie valide de l’espace d’adressage du processus ou le paramètre optlen est trop petit. | |
| Un appel Windows Sockets 1.1 bloquant 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 de la mémoire tampon pointées par le paramètre optval ne sont pas valides. | |
| La connexion a expiré lorsque SO_KEEPALIVE est définie. | |
| L’option est inconnue ou non prise en charge pour le fournisseur ou le socket spécifié (voir SO_GROUP_PRIORITY limitations). | |
| La connexion a été réinitialisée lorsque SO_KEEPALIVE est définie. | |
| 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.
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. |
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. |
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 |