Bonjour,
Je suis actuellement entrain d'écrire un petit client serveur pour faire des test avec Ocaml mais malheureusement certains détails m'échappent :
Le serveur est codé en java et envoie une suite de byte ainsi que le caractère de fin de ligne.
Le client est codé en Ocaml et réalise une opération toute simple. Connexion vers le serveur, récupération du in_channel et out_channel à partir de la socket et lecture sur in_channel à l'aide de input_line. Sans la boucle, ça fonctionne une fois puis l'application se ferme. Avec la boucle ça n'affiche plus rien du tout (ça attend).
J'aimerais que mon client ait un fonctionnement dans le même style que netcat ou telnet. Je suppose que l'on doit pouvoir jouer sur les buffers de l'entrée ou des choses comme ça mais je n'ai pas trouvé d'explication plus fournie. Je pensais qu'à partir du moment où le serveur envoyait 10 pour '\n' c'était gagné mais ça ne semble pas être le cas.
Voici les deux morceaux de code avec la variation boucle et sans boucle :
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 let open_connection ip port = let addr = Unix.inet_addr_of_string ip in let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in let sock_addr = Unix.ADDR_INET (addr, port) in try Unix.connect sock sock_addr; (Unix.in_channel_of_descr sock, Unix.out_channel_of_descr sock); with exn -> Unix.close sock; raise exn ;; let ip = Sys.argv.(1) in let port = int_of_string Sys.argv.(2) in let input, output = open_connection ip port in let message = input_line input in Printf.printf "%s\n" message
Je précise que le problème ne vient pas du serveur car netcat affiche bien les informations venant du serveur.
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
17
18 let open_connection ip port = let addr = Unix.inet_addr_of_string ip in let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in let sock_addr = Unix.ADDR_INET (addr, port) in try Unix.connect sock sock_addr; (Unix.in_channel_of_descr sock, Unix.out_channel_of_descr sock); with exn -> Unix.close sock; raise exn ;; let ip = Sys.argv.(1) in let port = int_of_string Sys.argv.(2) in let input, output = open_connection ip port in while true do let message = input_line input in Printf.printf "%s\n" message done
Voilà si vous pouviez m'aider ;-)
Merci à vous.
Sperca
Partager