diff options
Diffstat (limited to 'src/platform/linux/udp.rs')
-rw-r--r-- | src/platform/linux/udp.rs | 76 |
1 files changed, 66 insertions, 10 deletions
diff --git a/src/platform/linux/udp.rs b/src/platform/linux/udp.rs index 52e4c45..d3d61b6 100644 --- a/src/platform/linux/udp.rs +++ b/src/platform/linux/udp.rs @@ -1,26 +1,82 @@ use super::super::bind::*; use super::super::Endpoint; -use std::net::SocketAddr; +use std::io; +use std::net::{SocketAddr, UdpSocket}; +use std::sync::Arc; -pub struct LinuxEndpoint {} +#[derive(Clone)] +pub struct LinuxBind(Arc<UdpSocket>); -pub struct LinuxBind {} +pub struct LinuxOwner(Arc<UdpSocket>); -impl Endpoint for LinuxEndpoint { +impl Endpoint for SocketAddr { fn clear_src(&mut self) {} fn from_address(addr: SocketAddr) -> Self { - LinuxEndpoint {} + addr } fn into_address(&self) -> SocketAddr { - "127.0.0.1:6060".parse().unwrap() + *self } } -/* -impl Bind for PlatformBind { - type Endpoint = PlatformEndpoint; +impl Reader<SocketAddr> for LinuxBind { + type Error = io::Error; + + fn read(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr), Self::Error> { + self.0.recv_from(buf) + } +} + +impl Writer<SocketAddr> for LinuxBind { + type Error = io::Error; + + fn write(&self, buf: &[u8], dst: &SocketAddr) -> Result<(), Self::Error> { + self.0.send_to(buf, dst)?; + Ok(()) + } +} + +impl Owner for LinuxOwner { + type Error = io::Error; + + fn get_port(&self) -> u16 { + 1337 + } + + fn get_fwmark(&self) -> Option<u32> { + None + } + + fn set_fwmark(&mut self, value: Option<u32>) -> Option<Self::Error> { + None + } +} + +impl Drop for LinuxOwner { + fn drop(&mut self) {} +} + +impl Bind for LinuxBind { + type Error = io::Error; + type Endpoint = SocketAddr; + type Reader = LinuxBind; + type Writer = LinuxBind; +} + +impl PlatformBind for LinuxBind { + type Owner = LinuxOwner; + + fn bind(port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error> { + let socket = UdpSocket::bind(format!("0.0.0.0:{}", port))?; + let socket = Arc::new(socket); + + Ok(( + vec![LinuxBind(socket.clone())], + LinuxBind(socket.clone()), + LinuxOwner(socket), + )) + } } -*/ |