1#[cfg(not(target_os = "windows"))]
2mod unix;
3#[cfg(not(target_os = "windows"))]
4pub use self::unix::*;
5
6#[cfg(target_os = "windows")]
7mod windows;
8#[cfg(target_os = "windows")]
9pub use self::windows::*;
10
11pub struct FileDesc {
13 pub fd: CSocket,
14}
15
16impl Drop for FileDesc {
17 fn drop(&mut self) {
18 unsafe {
19 close(self.fd);
20 }
21 }
22}
23
24pub fn send_to(
25 socket: CSocket,
26 buffer: &[u8],
27 dst: *const SockAddr,
28 slen: SockLen,
29) -> std::io::Result<usize> {
30 let send_len = retry(&mut || unsafe {
31 sendto(
32 socket,
33 buffer.as_ptr() as Buf,
34 buffer.len() as BufLen,
35 0,
36 dst,
37 slen,
38 )
39 });
40
41 if send_len < 0 {
42 Err(std::io::Error::last_os_error())
43 } else {
44 Ok(send_len as usize)
45 }
46}
47
48pub fn recv_from(
49 socket: CSocket,
50 buffer: &mut [u8],
51 caddr: *mut SockAddrStorage,
52) -> std::io::Result<usize> {
53 let mut caddrlen = std::mem::size_of::<SockAddrStorage>() as SockLen;
54 let len = retry(&mut || unsafe {
55 recvfrom(
56 socket,
57 buffer.as_ptr() as MutBuf,
58 buffer.len() as BufLen,
59 0,
60 caddr as *mut SockAddr,
61 &mut caddrlen,
62 )
63 });
64
65 if len < 0 {
66 Err(std::io::Error::last_os_error())
67 } else {
68 Ok(len as usize)
69 }
70}