commit 3d41a5ff5559f07b163debf536a27ecbfc66f3b4 Author: Reynir Björnsson Date: Fri Sep 24 14:49:40 2021 +0200 Initial commit diff --git a/dune b/dune new file mode 100644 index 0000000..5d92799 --- /dev/null +++ b/dune @@ -0,0 +1,3 @@ +(executable + (name udpdup) + (libraries lwt lwt.unix)) diff --git a/dune-project b/dune-project new file mode 100644 index 0000000..c994249 --- /dev/null +++ b/dune-project @@ -0,0 +1 @@ +(lang dune 2.9) diff --git a/udpdup.ml b/udpdup.ml new file mode 100644 index 0000000..d0642c4 --- /dev/null +++ b/udpdup.ml @@ -0,0 +1,27 @@ +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 = ["127.0.0.1", 2234; "127.0.0.1", 2235] 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 ())