socket9 0.1.0-alpha.1

Extended untilities for the networking/unix sockets and raw network sockets
Documentation
#![cfg(unix)]

use std::{net::{SocketAddrV4, UdpSocket}, os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd}};

use socket9::{AsOsDescr, So9DomainRange, So9MsgFlags, So9SockDwFlags, So9SockProtocol, So9SockType, Socket9ExtSo, address::So9DomainInets, socket::{So9Marker, So9MarkerBind, So9MarkerStateless, Socket9}};

#[derive(Debug)]
pub struct UdpDatagramV4(UdpSocket);

impl AsFd for UdpDatagramV4
{
    fn as_fd(&self) -> BorrowedFd<'_> 
    {
        self.0.as_fd()
    }
}

impl AsRawFd for UdpDatagramV4
{
    fn as_raw_fd(&self) -> RawFd 
    {
        self.0.as_raw_fd()
    }
}

impl UdpDatagramV4
{
    
}

impl So9Marker for UdpDatagramV4
{
    type SockType = OwnedFd;

    const IS_LISTENING: bool = false;

    const SO_DOMAIN_GROUP: So9DomainRange = So9DomainRange::DoInets;

    const SO_TYPE: So9SockType = So9SockType::DGRAM;

    const SO_DEF_FLAGS: So9SockDwFlags = So9SockDwFlags::CLOEXEC;

    const SO_PROTO: So9SockProtocol = So9SockProtocol::NONE;

    const SOCK_SND_FLAGS: So9MsgFlags = So9MsgFlags::empty();

    const SOCK_SND_VECT_FLAGS: So9MsgFlags = So9MsgFlags::empty();

    const SOCK_RCV_FLAGS: So9MsgFlags = So9MsgFlags::empty();

    const SOCK_RCV_VECT_FLAGS: So9MsgFlags = So9MsgFlags::empty();

    type SockAddrType = SocketAddrV4;

    type SockAddrDomain = So9DomainInets;
}


impl So9MarkerBind for UdpDatagramV4{}

impl So9MarkerStateless for UdpDatagramV4 {}

impl From<Socket9<UdpDatagramV4>> for UdpDatagramV4
{
    fn from(value: Socket9<UdpDatagramV4>) -> Self 
    {
        let ofd: OwnedFd = value.into();
        return Self(UdpSocket::from(ofd));
    }
}

impl Socket9ExtSo<UdpDatagramV4> for Socket9<UdpDatagramV4> {}
impl Socket9ExtSo for UdpDatagramV4 {}
impl AsOsDescr for UdpDatagramV4 {}

#[test]
fn test_custrom_socket1()
{
    let rcv = Socket9::<UdpDatagramV4>::new_with_bind(&"127.0.0.1:0").unwrap();

    let rcv_local = rcv.local_addr().unwrap();

    println!("{}", rcv_local);

    let snd = Socket9::<UdpDatagramV4>::new_with_bind(&"127.0.0.1:0").unwrap();

    snd.connect(rcv_local).unwrap();


    let data = [1,2,3,4];
    
    let snd_n = snd.send(&data[..3]).unwrap();

     let mut rcv_data = [0_u8; 4];

    let rcv_n = rcv.recv(&mut rcv_data).unwrap();

    assert_eq!(rcv_n, snd_n);
    assert_eq!(&data[0..snd_n], &rcv_data[0..rcv_n]);
}