38 lines
1.1 KiB
OCaml
38 lines
1.1 KiB
OCaml
open Lwt.Infix
|
|
|
|
let port = 2233
|
|
|
|
let rec loop fd dests =
|
|
let recv_buf = Bytes.make 2048 '\000' in
|
|
Lwt_unix.recv fd recv_buf 0 (Bytes.length recv_buf) [] >>= fun read_len ->
|
|
Lwt_list.iter_p
|
|
(fun fd ->
|
|
Lwt_unix.send fd recv_buf 0 read_len [] >>= fun _send_len ->
|
|
Lwt.return_unit)
|
|
dests >>= fun () ->
|
|
loop fd dests
|
|
|
|
let main () =
|
|
let addr = "0.0.0.0" in
|
|
let dests =
|
|
Array.to_list Sys.argv
|
|
|> List.tl
|
|
|> List.map (fun dest ->
|
|
match String.split_on_char ':' dest with
|
|
| [host; port] ->
|
|
host, int_of_string port
|
|
| _ ->
|
|
Printf.eprintf "bad argument: %s" dest;
|
|
exit 1)
|
|
in
|
|
let fd = Lwt_unix.socket Lwt_unix.PF_INET Lwt_unix.SOCK_DGRAM 0 in
|
|
Lwt_unix.bind fd Unix.(ADDR_INET (inet_addr_of_string addr, port)) >>= fun () ->
|
|
Lwt_list.map_p (fun (addr, port) ->
|
|
let socket = Lwt_unix.socket Unix.PF_INET Unix.SOCK_DGRAM 0 in
|
|
Lwt_unix.connect socket Unix.(ADDR_INET (inet_addr_of_string addr, port)) >>= fun () ->
|
|
Lwt.return socket)
|
|
dests >>= fun dests ->
|
|
loop fd dests
|
|
|
|
let () = Lwt_main.run (main ())
|