On commence par écrire quelques fonctions utilitaires que l'on regroupe dans un fichier inet.ml.

On commencer par une fonction 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);;
On écrit une fonction 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);;
Enfin, on écrit une fonction 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));;
On peut mainteant passe au programme 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 yraise 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 nbdisplay () 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);;
Reste la fonction principale qui gère les arguments passés sur la ligne de commande.
      
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 ();;