Lecture des champs SIO_KEEPALIVE_VALS sur un socket Windows (pour les périodes d’inactivité et d’intervalle de maintenance)

Étant donné un socket Windows, je veux déterminer les valeurs qu’il utilise pour le temps d’inactivité TCP keepalive et le temps d’intervalle TCP keepalive (à peu près équivalent aux parameters TCP_KEEPIDLE et TCP_KEEPINTVL sur les sockets Berkeley).

Je vois que vous pouvez définir ces valeurs à l’aide d’un appel WSAIoctl (voir http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx ). Cependant, il ne semble pas y avoir d’API pour lire leurs valeurs actuelles. J’ai essayé d’appeler WSAIoctl avec un paramètre de sortie WSAIoctl mais le paramètre d’entrée NULL , comme ceci:

 DWORD bytes_returned; struct tcp_keepalive keepalive_opts; int rv = WSAIoctl(socket, SIO_KEEPALIVE_VALS, NULL, 0, &keepalive_opts, sizeof(keepalive_opts), &bytes_returned, NULL, NULL); 

Mais ceci me renvoie un WSAEFAULT (“Le système a détecté une adresse de pointeur invalide en essayant d’utiliser un argument de pointeur dans un appel.”).

Je pourrais appeler WSAIoctl avec à la fois un paramètre d’entrée et un paramètre de sortie, mais je ne veux pas définir les valeurs, je veux juste les lire. Et pour autant que je sache, fournir un paramètre d’entrée non NULL entraînerait la définition des parameters pour toutes les valeurs se struct tcp_keepalive dans cet espace mémoire (défini par la struct tcp_keepalive ; voir à nouveau http://msdn.microsoft.com /en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx ).

Ce qui précède met également en évidence un autre problème avec le fait de ne pas savoir quelles sont les valeurs actuelles: Je ne peux pas définir une seule durée d’inactivité keepalive ou une durée d’intervalle keepalive. les deux membres de la structure que je dois fournir.

Je sais que je pourrais supposer des choses sur les valeurs définies sur la base de la documentation Windows, mais je préfère ne pas en tenir compte. Je vois que http://technet.microsoft.com/en-us/library/bb726981.aspx#EDAA définit les valeurs par défaut KeepAliveInterval et KeepAliveTime . Cependant, le dossier Parameters de mon registre Windows 7 ne contient aucune de ces clés, donc je dois vraiment me fier à la documentation correcte à 100% (pour connaître les valeurs par défaut reçues par un socket), ce qui est bien pire que par programmation. les récupérer (même les récupérer du registre peut être correct, mais l’expérience ci-dessus montre que je ne peux pas).

Existe-t-il un moyen d’obtenir le temps d’inactivité TCP keepalive actuel et les valeurs de temps d’intervalle TCP keepalive pour un socket Windows?

Contrairement à TCP_KEEPIDLE et TCP_KEEPINTVL , qui peuvent être utilisés avec getsockopt() , il est impossible de lire les valeurs SIO_KEEPALIVE_VALS actuelles pour un socket, mais de les définir.