<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Programmer des applications</title><link href="style.css" rel="stylesheet" type="text/css" /><meta content="DocBook XSL Stylesheets V1.73.2" name="generator" /><link rel="start" href="index.html" title="Guide pratique du maintien de connexion TCP" /><link rel="up" href="index.html" title="Guide pratique du maintien de connexion TCP" /><link rel="prev" href="ar01s03.html" title="Utiliser TCP keepalive sous Linux" /><link rel="next" href="ar01s05.html" title="Implémenter keepalive sur une application tierce" /></head><body><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">Programmer des applications</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="ar01s03.html">Précédent</a> </td><th align="center" width="60%"> </th><td align="right" width="20%"> <a accesskey="n" href="ar01s05.html">Suivant</a></td></tr></table><hr /></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title"><a id="programmer" />Programmer des applications</h2></div></div></div><p> 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. </p><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="quandrequis" />Quand votre code requiert keepalive</h3></div></div></div><p> 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. </p><p> 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. </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="setsockopt" />L'appel de fonction <code class="function">setsockopt</code></h3></div></div></div><p> 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: <pre class="synopsis"> int <code class="function">setsockopt</code>(int s, int level, int optname, const void *optval, socklen_t optlen) </pre> </p><p> Le premier paramètre est la socket, préalablement créée avec <span class="citerefentry"><span class="refentrytitle"><code class="function">socket</code></span>(2)</span>; le second doit être <code class="constant"> SOL_SOCKET</code>, et le troisième <code class="constant">SO_KEEPALIVE </code>. 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. </p><p> Conformément au manuel, le code retour <span class="returnvalue">0</span> indique le succès, <span class="returnvalue">-1</span> est la valeur d'erreur (et <code class="varname">errno</code> est correctement renseignée). </p><p> Il existe aussi trois autres options de socket qu'il est possible de renseigner en écrivant votre application. Toutes utilisent le niveau <code class="constant">SOL_TCP</code> au lieu de <code class="constant">SOL_SOCKET</code>, 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. </p><div class="itemizedlist"><ul><li><p><code class="constant">TCP_KEEPCNT</code> : prend le pas sur <code class="varname"> tcp_keepalive_probes</code></p></li><li><p><code class="constant">TCP_KEEPIDLE</code> : prend le pas sur <code class="varname"> tcp_keepalive_time</code></p></li><li><p><code class="constant">TCP_KEEPINTVL</code> : prend le pas sur <code class="varname"> tcp_keepalive_intvl</code></p></li></ul></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="exemples" />Exemples de code</h3></div></div></div><p> 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. </p><div class="informalexample"><pre class="programlisting"> /* --- 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 --- */ </pre></div></div></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="ar01s03.html">Précédent</a> </td><td align="center" width="20%"> </td><td align="right" width="40%"> <a accesskey="n" href="ar01s05.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">Utiliser TCP keepalive sous Linux </td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%"> Implémenter keepalive sur une application tierce</td></tr></table></div></body></html>