Cette section aborde le code nécessaire à l'écriture d'une application utilisant keepalive. Ce n'est pas un manuel de programmation, et il requiert d'avoir une connaissance du langage C et des concepts réseau. Je considère que la notion de socket vous est familière, de même que tous les aspects généraux de votre application.
Les applications réseau ne requièrent pas toutes l'aide du keepalive. Souvenez vous qu'il s'agit de TCP keepalive. Comme vous pouvez le deviner, seules les sockets TCP peuvent en tirer parti.
La plus belle chose que vous puissiez faire en écrivant une application est de la rendre aussi paramétrable que possible, et de ne pas en forcer les choix. Si vous voulez prendre en compte le bonheur de vos utilisateurs, vous devriez implémenter keepalive et laisser les utilisateurs décider s'ils veulent ou non l'utiliser en prévoyant un paramètre de configuration ou une option de ligne de commande.
Tout ce dont vous avez besoin pour que keepalive soit activé sur une socket particulière est de positionner l'option sur cette socket. Le prototype de fonction est le suivant:
int setsockopt
(int s, int level, int optname,
const void *optval, socklen_t optlen)
Le premier paramètre est la socket, préalablement créée avec
socket
(2); le second doit être
SOL_SOCKET
, et le troisième SO_KEEPALIVE
. Le quatrième doit être un entier booleéen, indiquant que
l'option est active, alors que le dernier est la taille de la valeur
passée précédemment.
Conformément au manuel, le code retour 0
indique le succès, -1 est la valeur
d'erreur (et errno
est correctement renseignée).
Il existe aussi trois autres options de socket qu'il est possible de
renseigner en écrivant votre application. Toutes utilisent le niveau
SOL_TCP
au lieu de SOL_SOCKET
,
et elles prennent le pas sur les variables système pour la socket
courante. Si vous lisez avant d'écrire, les paramètres système seront
retournés.
TCP_KEEPCNT
: prend le pas sur
tcp_keepalive_probes
TCP_KEEPIDLE
: prend le pas sur
tcp_keepalive_time
TCP_KEEPINTVL
: prend le pas sur
tcp_keepalive_intvl
Voici un petit exemple qui crée une socket, montre que keepalive est désactivé, puis l'active et vérifie que l'option est réellement positionnée.
/* --- début du programme de test KEEPALIVE --- */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(void); int main() { int s; int optval; socklen_t optlen = sizeof(optval); /* Creation de la socket */ if((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket()"); exit(EXIT_FAILURE); } /* Verifie l'etat de l'option keepalive */ if(getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) { perror("getsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE is %s\n", (optval ? "ON" : "OFF")); /* Rend l'option active */ optval = 1; optlen = sizeof(optval); if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { perror("setsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE set on socket\n"); /* Verifie a nouveau son etat */ if(getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) { perror("getsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE is %s\n", (optval ? "ON" : "OFF")); close(s); exit(EXIT_SUCCESS); } /* --- fin du programme de test KEEPALIVE --- */