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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. |
|
Le sous-système réseau a échoué. |
|
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 . |
|
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 est inconnu ou non valide. Cette erreur est également retournée si le socket était déjà dans un état d’écoute. |
|
L’option est inconnue ou non prise en charge par la famille de protocoles indiquée. |
|
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 |
|
Voir aussi