open Sys;; open Unix;; open Inet;; (** Fonction de recopie *) let netcat machine port = let socket = open_connection machine port in ignore (signal sigpipe Signal_ignore); let buffer_size = 1024 in let buffer = String.create buffer_size in let descriptors = ref [socket;stdin] in let rec multiplex () = let read,_,_ = select !descriptors [] [] (-1.) in List.iter copy read; and copy fd = begin if fd = socket then begin match read socket buffer 0 buffer_size with 0 -> close socket | nb -> ignore (write stdout buffer 0 nb); multiplex () end else begin match read stdin buffer 0 buffer_size with 0 -> descriptors := [socket]; multiplex () | nb -> ignore (write socket buffer 0 nb); multiplex() end end in try multiplex () with _ -> raise (Failure "netcat IO error");; (** Récupération des arguments *) let main () = if Array.length Sys.argv <> 3 then begin prerr_endline ("Usage: "^Sys.argv.(0)^" machine port"); exit 1 end else try let address = inet_addr_of_name Sys.argv.(1) in let port = port_of_string Sys.argv.(2) in netcat address port with Failure message -> prerr_endline message; exit 2;; main ();; |