option de socket SO_CONDITIONAL_ACCEPT

L’option de socket SO_CONDITIONAL_ACCEPT est conçue pour permettre à une application de décider d’accepter ou non une connexion entrante sur un socket d’écoute.

Valeur d’option de socket

La constante qui représente cette option de socket est 0x3002.

Syntaxe

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

Paramètres

s [in]

Descripteur identifiant le socket.

level [in]

Niveau auquel l’option est définie. Utilisez SOL_SOCKET pour cette opération.

optname [in]

Option de socket pour laquelle la valeur doit être définie. Utilisez SO_CONDITIONAL_ACCEPT pour cette opération.

optval [out]

Pointeur vers la mémoire tampon contenant la valeur de l’option à définir. Ce paramètre doit pointer vers la mémoire tampon égale ou supérieure à la taille d’une valeur DWORD .

Cette valeur est traitée comme une valeur booléenne avec 0 utilisé pour indiquer FALSE (désactivé) et une valeur différente de zéro pour indiquer TRUE (activé).

optlen [in, out]

Pointeur vers la taille, en octets, de la mémoire tampon optval . Cette taille doit être égale ou supérieure à la taille d’une valeur DWORD .

Valeur retournée

Si l’opération se termine correctement, setsockopt retourne zéro.

Si l’opération échoue, 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
L’un des paramètres optval ou optlen pointe vers la mémoire qui n’est pas dans une partie valide de l’espace d’adressage utilisateur. Cette erreur est également retournée si la valeur pointée vers le paramètre optlen est inférieure à la taille d’une valeur DWORD .
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 est inconnu ou non valide. Cette erreur est également retournée si le socket était déjà dans un état d’écoute.
WSAENOPROTOOPT
L’option est inconnue ou non prise en charge par la famille de protocoles indiquée.
WSAENOTSOCK
Le descripteur n’est pas un socket.

 

Notes

La fonction setsockopt appelée avec l’option socket SO_CONDITIONAL_ACCEPT permet à une application de décider d’accepter ou non une connexion entrante sur un socket d’écoute. L’option d’acceptation conditionnelle pour un socket est désactivée (définie sur FALSE) par défaut.

Lorsque cette option de socket est activée, la pile TCP n’accepte pas automatiquement les connexions. Il attend que l’application indique qu’elle accepte la connexion via le rappel d’acceptation conditionnelle inscrit avec la fonction WSAAccept . Une fois qu’une demande de connexion est reçue, Winsock appelle le rappel d’acceptation conditionnelle inscrit par l’application. Ce n’est que lorsque le rappel d’acceptation conditionnelle retourne CF_ACCEPT winsock avertit le transport d’accepter entièrement la connexion.

Lorsque l’option de socket SO_CONDITIONAL_ACCEPT est activée (définie sur TRUE), cela a plusieurs effets secondaires sur le socket :

  • Cela désactive les défenses de protection contre les attaques SYN intégrées de la pile TCP, car l’application prend désormais en charge l’acceptation des connexions.
  • Cela désactive efficacement le backlog d’écoute, car les connexions ne sont pas acceptées pour le compte d’un socket d’écoute. Une connexion n’est jamais entièrement acceptée tant que l’application n’accepte pas entièrement l’utilisation du mécanisme CF_ACCEPT .
  • Cela signifie également que l’application veille à toujours être dans un état pour gérer facilement les rappels d’acceptation pour accepter la connexion. Si l’application est occupée à effectuer d’autres traitements, le côté client peut expirer avant que l’application accepte réellement la connexion. Cela entraîne une mauvaise expérience client.

En règle générale, la main raison pour laquelle les applications utilisent l’acceptation conditionnelle est d’inspecter l’adresse IP source ou le port utilisé par le client de connexion, puis de décider d’accepter ou de refuser la connexion. Toutefois, les applications sont susceptibles de fonctionner mieux si l’option SO_CONDITIONAL_ACCEPT n’est pas activée et si l’application permet à la pile TCP et au backlog d’écoute de fonctionner comme prévu. Ensuite, lorsque l’application gère la connexion acceptée, si elle provient d’une adresse ou d’un port source IP incorrect, l’application peut simplement fermer le socket. L’inconvénient de sécurité de ce comportement est que le client a maintenant la confirmation que l’application écoute sur une adresse IP et un port, car elle a fermé de force la connexion précédemment acceptée. Toutefois, les inconvénients de l’activation de SO_CONDITIONAL_ACCEPT généralement supérieurs à cette limitation.

La fonction getsockopt appelée avec l’option de socket SO_CONDITIONAL_ACCEPT permet à une application de récupérer l’état actuel de l’option d’acceptation conditionnelle, bien qu’il ne s’agisse pas d’une fonctionnalité normalement utilisée. Si une application doit activer l’acceptation conditionnelle sur un socket, elle appelle simplement la fonction setsockopt pour activer l’option.

Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2008 [applications de bureau uniquement]
En-tête
Ws2def.h (inclure Winsock2.h)

Voir aussi

getsockopt

setockopt

WSAAccept