From 5ef0461e65d11e946807cd9af5c1a92c7d8cefa4 Mon Sep 17 00:00:00 2001 From: Gilles Soulier Date: Fri, 22 May 2026 11:37:45 +0200 Subject: [PATCH] feat(agent): transport UDP fire-and-forget + test loopback --- agent/src/transport/udp.rs | 41 ++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/agent/src/transport/udp.rs b/agent/src/transport/udp.rs index fbd37ed..d8c938e 100644 --- a/agent/src/transport/udp.rs +++ b/agent/src/transport/udp.rs @@ -1,9 +1,42 @@ -pub struct UdpSender; +use std::net::UdpSocket; + +pub struct UdpSender { + socket: UdpSocket, + addr: String, +} impl UdpSender { - pub fn new(_ip: &str, _port: u16) -> Self { - UdpSender + pub fn new(ip: &str, port: u16) -> Self { + let socket = UdpSocket::bind("0.0.0.0:0") + .expect("Impossible de créer le socket UDP"); + UdpSender { + socket, + addr: format!("{}:{}", ip, port), + } } - pub fn send(&self, _json: &str) {} + pub fn send(&self, json: &str) { + let _ = self.socket.send_to(json.as_bytes(), &self.addr); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::UdpSocket; + + #[test] + fn test_udp_envoi_loopback() { + let recv = UdpSocket::bind("127.0.0.1:0").unwrap(); + let port = recv.local_addr().unwrap().port(); + recv.set_read_timeout(Some(std::time::Duration::from_millis(500))).unwrap(); + + let sender = UdpSender::new("127.0.0.1", port); + sender.send(r#"{"status":"ok"}"#); + + let mut buf = [0u8; 1024]; + let (n, _) = recv.recv_from(&mut buf).unwrap(); + let msg = std::str::from_utf8(&buf[..n]).unwrap(); + assert_eq!(msg, r#"{"status":"ok"}"#); + } }