open Unix;; (** Ouverture et connexion d'une socket *) let open_connection address port = let socket = socket PF_INET SOCK_STREAM 0 in (* bind socket (ADDR_INET (inet_addr_any, 0));*) connect socket (ADDR_INET (address,port)); socket;; (** Fonction de recopie *) let netcat machine port = let socket = open_connection machine port in 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 multiplex ();; (** 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 _ -> raise (Failure "inet_addr_of_name");; (** 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");; (** 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 "inet_addr_of_name" -> prerr_endline ("Unknown host: "^Sys.argv.(1)); exit 2 | Failure "port_of_string" -> prerr_endline ("Unknown port: "^Sys.argv.(2)); exit 3;; handle_unix_error main ();; |