inet.ml
.open_connection addr port
qui prend en argument
une adresse internet de type inet_addr
et un numéro de port TCP sous
la forme d'un entier et qui retourne le descripteur d'une prise
connectée au serveur correspondant à cette adresse et à ce
port. Si la connexion a échoué la fonction devra lever une exception
Failure
indiquant que la connexion vers cette adresse et ce port
a échoué.
open Unix;; open Printf;; (** Ouverture et connexion d'une socket *) let open_connection address port = try let socket = socket PF_INET SOCK_STREAM 0 in connect socket (ADDR_INET (address,port)); socket with _ -> let addr = string_of_inet_addr address in let message = sprintf "open_connection %s %d : unable to connect" addr port in raise (Failure message);; |
inet_addr_of_name
qui retourne une adresse de type
inet_addr
à partir d'un nom de machine ou d'un numéro IP passé sous
forme de chaîne de caractères. En cas d'erreur la fonction devra lever une
exception Failure
.
(** Conversion d'une chaîne de caratères en adresse Internet *) let inet_addr_of_name machine = try (gethostbyname machine).h_addr_list.(0) with _ -> try inet_addr_of_string machine with _ -> let message = sprintf "inet_addr_of_name %s : unknown machine" machine in raise (Failure message);; |
port_of_string
qui retourne un numéro de port
à partir d'un nom de service ou d'un entier passés sous forme de chaîne
de caractères. Cette fonction devra lever une exception Failure
en cas d'erreur.
(** Conversion d'une chaîne de caratères en n° de port tcp *) let port_of_string port = try try (getservbyname port "tcp").s_port with Not_found -> int_of_string port with _ -> raise (Failure ("port_of_string "^ port));; |
mon_wget.ml
.
open Sys;; open Unix;; open Printf;; open Inet;; let try_finalize f x finally y = let res = try f x with exn -> finally y; raise exn in finally y; res;; (** Client HTTP/0.9 *) let http_client machine port path = let p = port_of_string port in let addr = inet_addr_of_name machine in let socket = open_connection addr p in let command = sprintf "GET %s\r\n" path in try ignore (signal sigpipe Signal_ignore); ignore (write socket command 0 (String.length command)); let buffer_size = 4096 in let buffer = String.create buffer_size in let rec display () = match read socket buffer 0 buffer_size with 0 -> () | nb -> output Pervasives.stdout buffer 0 nb; display () in try_finalize display () close socket with _ -> let message = sprintf "http_client %s %s %s I/O error" machine port path in raise (Failure message);; |
let main () = if Array.length Sys.argv <> 4 then begin prerr_endline ("Usage: "^Sys.argv.(0)^" machine port path"); exit 1 end else try http_client Sys.argv.(1) Sys.argv.(2) Sys.argv.(3) with Failure message -> prerr_endline message; exit 2;; main ();; |