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