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.
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 |
|---|---|
| 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 par le paramètre optlen est inférieure à la taille d’une valeur DWORD . |
|
| 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 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. |
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 |
|
Voir aussi