From 3d41a5ff5559f07b163debf536a27ecbfc66f3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Fri, 24 Sep 2021 14:49:40 +0200 Subject: [PATCH] Initial commit --- dune | 3 +++ dune-project | 1 + udpdup.ml | 27 +++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 dune create mode 100644 dune-project create mode 100644 udpdup.ml 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 ())