#![cfg(windows)]
use std::
{
net::{SocketAddrV4, UdpSocket},
os::windows::io::{AsRawSocket, AsSocket, BorrowedSocket, OwnedSocket, RawSocket}
};
use socket9::
{
AsOsDescr, So9DomainRange, So9MsgFlags, So9SockDwFlags, So9SockProtocol, So9SockType, Socket9ExtSo, address::So9DomainInets, socket::{So9Marker, So9MarkerBind, So9MarkerStateless, Socket9}
};
#[derive(Debug)]
pub struct UdpDatagramV4(UdpSocket);
impl AsSocket for UdpDatagramV4
{
fn as_socket(&self) -> BorrowedSocket<'_>
{
self.0.as_socket()
}
}
impl AsRawSocket for UdpDatagramV4
{
fn as_raw_socket(&self) -> RawSocket
{
self.0.as_raw_socket()
}
}
impl UdpDatagramV4
{
}
impl So9Marker for UdpDatagramV4
{
type SockType = OwnedSocket;
const SO_DEF_FLAGS: So9SockDwFlags = So9SockDwFlags::empty();
const IS_LISTENING: bool = false;
const SO_DOMAIN_GROUP: So9DomainRange = So9DomainRange::DoInets;
const SO_TYPE: So9SockType = So9SockType::DGRAM;
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: OwnedSocket = 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]);
}