summaryrefslogtreecommitdiff
path: root/netcat.ml
blob: 5fcaa28e9d9e6f8c316485b06dfcff11425cfd76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(** Connect to addr and port and start communicating **)
let nc addr port =
    let rec discuss csock =
        let aux input output =
            let buffer = Bytes.create 256 in
            let n = Unix.read input buffer 0 (Bytes.length buffer) in
            match n with
            | 0 -> ()
            | _ -> ignore (Unix.write output buffer 0 n); discuss csock
        in

        match Unix.select [Unix.stdin; csock] [] [] (-1.) with
        | (fds, _, _) -> (
            match List.hd fds == Unix.stdin with
            | true  -> aux Unix.stdin csock
            | false -> aux csock Unix.stdout
        )
    in

    let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
    Unix.connect sock (Unix.ADDR_INET (Unix.inet_addr_of_string addr, port));
    discuss sock

let () = match Array.length Sys.argv with
| 3 -> nc Sys.argv.(1) (int_of_string Sys.argv.(2))
| _ -> raise (Failure "Usage error")