Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 3234

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<!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 &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;

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)) &lt; 0) {
      perror("socket()");
      exit(EXIT_FAILURE);
   }

   /* Verifie l'etat de l'option keepalive */
   if(getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &amp;optval, &amp;optlen) &lt; 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, &amp;optval, optlen) &lt; 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, &amp;optval, &amp;optlen) &lt; 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>