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 :

[OCaml] Petit problème avec les sockets


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut [OCaml] Petit problème avec les sockets
    Bonjour

    Je débute en OCaml et j'aimerais pouvoir me servir des sockets, ces petites bêtes qui se parlent par le biais d'internet.

    N'ayant qu'un seul ordinateur, je commence pour l'instant par essayer de se faire parler deux sockets venant de deux fenêtres OCaml différentes. Je m'explique :
    J'ouvre deux fois OCaml, dans l'un je met le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
         (* En lecture : *)
     
     
    #load "unix.cma";;
     
    let my_name = Unix.gethostname() ;;
    let my_entrie_byname = Unix.gethostbyname my_name ;;
    let my_addr = my_entrie_byname.Unix.h_addr_list.(0) ;;
     
    let sock_lec = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 ;;
    Unix.bind sock_lec (Unix.ADDR_INET(my_addr, 12345)) ;;
    Unix.listen sock_lec 1;;
    let (sock_serv, sock_addr) = Unix.accept sock_lec;;
    print_endline "Connecté !";;
    que j'exécute, il se met donc en attente d'un autre socket se connectant à lui, puis dans l'autre fenêtre Caml je met le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
         (* En écriture : *)
     
     
    #load "unix.cma";;
     
    let my_name = Unix.gethostname() ;;
    let my_entrie_byname = Unix.gethostbyname my_name ;;
    let my_addr = my_entrie_byname.Unix.h_addr_list.(0) ;;
     
    let sock_ecr = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 ;;
    Unix.bind sock_ecr (Unix.ADDR_INET(my_addr, 12346)) ;;
    let addr_ecr = Unix.ADDR_INET (my_addr,12345);;
    Unix.connect sock_ecr addr_ecr;;
    print_endline "Connecté !";;
    Quand j'exécute ce dernier, tout se passe bien, les deux fenêtres m'affichent alors "Connecté !" et attendent de nouvelles instructions.

    Maintenant je veux envoyer un message de sock_ecr vers sock_lec, donc en utilisant Unix.read et Unix.write, mais ils me demandent des Unix.file_descr, je met quoi?
    J'ai essayé avec la commande Unix.pipe(), mais ça ne semble pas être la bonne, le message ne passe pas.

    Merci d'avance pour votre aide

    Fractal

  2. #2
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Salut, en effet Unix.pipe n'est pas la solution (d'ailleurs si tu utilises des sockets, c'est précisément pour ne pas utiliser des pipes, normalement).
    Il te suffit de remarquer que le type des sockets est... celui des descripteurs de fichiers : quand tu crées des sockets, les machins que tu obtiens sont des file_descr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val socket : socket_domain -> socket_type -> int -> file_descr
    Après, tu peux écrire dedans, etc comme dans n'importe quel autre descripteur de fichiers (et ne pas oublier de les fermer, comme pour n'importe quel autre descripteur de fichiers ^^)

    De manière générale, pour tout savoir sur la programmation système en Caml (et en particulier les sockets dans le Chap. 6), il y a ça, qui est un très bon cours.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Salut

    Il te suffit de remarquer que le type des sockets est... celui des descripteurs de fichiers
    Voui, ça je suis d'accord avec toi, mais par exemple dans la fenêtre pour l'écriture, je ne connais que le socket sock_ecr, et pas sock_lec qui est celui dans lequel je devais écrire, non?
    Ou alors c'est dans le sock_ecr que j'ai crée au début que je dois écrire, et dans le sock_lec que j'ai créé que je dois lire?
    Je pensais qu'à la connection on récupérait un autre nom de socket, le socket cible, correspondant à l'endroit où on devait lire ou écrire.

    * va tester *

    Ca marche pas
    Il m'envoie une exception quand j'essaye de lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Unix.read sock_lec str 0 7;;
     
      ->  Exception: Unix.Unix_error (Unix.ENOTCONN, "read", "")
    Fractal

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Ca marche

    C'était bien dans sock_ecr qu'il fallait écrire, mais c'était sur sock_serv qu'il fallait lire.

    Merci beaucoup

    Fractal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  2. [VBA-Excel] Petit problème avec les formulaires
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/08/2006, 09h22
  3. Petit problème avec les accents circonflexes...
    Par Harvester dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 29/11/2005, 18h44
  4. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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