IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Différence "Unix.shutdown_connection" et "Unix.close" ?


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Différence "Unix.shutdown_connection" et "Unix.close" ?
    Bonjour,

    Dans le cadre du développement d'un client MySQL, je cherche à savoir s'il existe une différence entre l'utilisation de "Unix.shutdown_connection" et "Unix.close" pour fermer la connexion.

    Avec le programme d'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i = 1 to 500000 do
      let addr = Unix.inet_addr_of_string "192.168.1.20" in
      let port = 3306 in
      let sockaddr = Unix.ADDR_INET(addr, port) in
      let (ic, oc) = Unix.open_connection sockaddr in
      let () = Unix.sleep 1 in
      let () = Unix.shutdown_connection ic in
      ()
    done
    Si j'observe le nombre de fichiers ouverts par le processus avec la commande "fstat" (sous système FreeBSD), je constate que ce nombre augmente constamment, comme si le socket n'était jamais fermé (?).

    Alors qu'avec ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i = 1 to 500000 do
      let addr = Unix.inet_addr_of_string "192.168.1.20" in
      let port = 3306 in
      let sockaddr = Unix.ADDR_INET(addr, port) in
      let (ic, oc) = Unix.open_connection sockaddr in
      let () = Unix.sleep 1 in
      let () = Unix.close (Unix.descr_of_in_channel ic) in
      ()
    done
    où la seule différence est l'utilisation de "Unix.close" à la place de "Unix.shutdown_connection", le nombre de fichiers reste constant, ce qui semble indiquer que le socket est bien fermé.

    Pourquoi cette différence de comportement ?? "Unix.shutdown_connection" est-il nécessaire mais pas suffisant pour fermer un socket ?

    Configuration utilisée : FreeBSD 9.1 et OCaml 4.00.0.


    Stéphane.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Bonjour,

    À supposer que « shutdown_connection » soit bien l'alter ego de l'appel système UNIX shutdown(), cet appel sert à mettre fin « à tout ou partie d'une connexion full duplex » ouverte. Ça veut dire que ça ne détruit pas le socket côté système mais que cela interdit toute émission ou réception ultérieure de données.

    Disons que shutdown() est implicite quand tu appelles close(), mais c'est pratique de pouvoir l'utiliser lorsque l'exploitation des lignes ont un coût. Et surtout, ça permet de préparer la fin d'une connexion tout en te laissant le temps de recevoir ce qui a déjà été envoyé et est encore dans les buffers.

    Du côté d'un serveur, par exemple Web, c'est intéressant si tu dois envoyer une grosse page en sachant que tu refermeras juste derrière. Tu peux d'emblée refermer la connexion en lecture si tu es sûr que tout ce que tu vas recevoir entre temps sera abandonné, avant de démarrer l'émission de la page.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    OCaml propose l'appel système "shutdown" mais sous le même nom (voir http://caml.inria.fr/pub/docs/manual...bref/Unix.html , section "Sockets"). La fonction "shutdown_connection" (voir même page, section "High-level network connection functions") est présentée comme le pendant de la fonction "open_connection". C'est la raison pour laquelle je pensais qu'elle se chargeait de tout désallouer.

Discussions similaires

  1. .my_kshrc[25]: no closing quote
    Par esipage dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 04/09/2012, 13h28
  2. Différence entre %STR et %QUOTE
    Par fafabzh6 dans le forum Macro
    Réponses: 10
    Dernier message: 14/03/2011, 18h43
  3. [PC-Unix] Portage Cobol DPS7 vers UNIX
    Par PatrickB3109 dans le forum Cobol
    Réponses: 11
    Dernier message: 15/05/2009, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo