Partager via


option de socket SO_CONDITIONAL_ACCEPT

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

Valeur de l’option 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ée 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 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
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 par le paramètre optlen est inférieure à la taille d’une valeur DWORD .
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 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.

 

Remarques

La fonction setsockopt appelée avec l’option de socket SO_CONDITIONAL_ACCEPT permet à une application de décider s’il faut 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 auprès de la fonction WSAAccept . Une fois qu’une demande de connexion est reçue, Winsock appelle le rappel d’acceptation conditionnelle inscrit par l’application. Uniquement lorsque le rappel d’acceptation conditionnelle retourne CF_ACCEPT winsock notifie le transport pour 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 intégrées de protection contre les attaques SYN de la pile TCP, car l’application prend désormais possession de l’acceptation des connexions.
  • Cela désactive efficacement le backlog d’écoute, car les connexions ne sont pas acceptées au nom 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 de CF_ACCEPT .
  • Cela signifie également que l’application s’occupe toujours d’ê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 conduit à une expérience client médiocre.
  • Certaines optimisations de pile TCP ne s’appliquent pas aux connexions entièrement acceptées, même une fois l’acceptation conditionnelle terminée. Cela peut réduire les performances de la connexion pendant toute sa durée de vie.

En règle générale, les applications utilisent l’acceptation conditionnelle pour inspecter l’adresse IP source ou le port utilisé par le client de connexion, puis décider d’accepter ou de rejeter la connexion. Toutefois, les applications sont susceptibles d’être plus performantes si l’option SO_CONDITIONAL_ACCEPT n’est pas activée et que l’application autorise la pile TCP et le backlog d’écoute à fonctionner comme prévu. Ensuite, lorsque l’application gère la connexion acceptée, si elle provient d’une adresse ip source ou d’un port incorrects, l’application peut simplement fermer le socket. L’inconvénient de sécurité de ce comportement est que maintenant le client a la confirmation que l’application écoute sur une adresse IP et un port, car elle a fermé avec force la connexion précédemment acceptée. Toutefois, les inconvénients de l’activation de SO_CONDITIONAL_ACCEPT l’emportent généralement sur 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 que cette fonctionnalité ne soit pas 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

Requirement Valeur
Client minimal pris en charge
Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2008 [applications de bureau uniquement]
Header
Ws2def.h (include Winsock2.h)

Voir aussi

getsockopt

setsockopt

WSAAccept