1 use std::io;
2 use std::net::{self, SocketAddr};
3 use std::os::windows::io::AsRawSocket;
4
5 use winapi::um::winsock2::{self, PF_INET, PF_INET6, SOCKET, SOCKET_ERROR, SOCK_STREAM};
6
7 use crate::sys::windows::net::{init, new_socket, socket_addr};
8
new_for_addr(address: SocketAddr) -> io::Result<SOCKET>9 pub(crate) fn new_for_addr(address: SocketAddr) -> io::Result<SOCKET> {
10 init();
11 let domain = match address {
12 SocketAddr::V4(_) => PF_INET,
13 SocketAddr::V6(_) => PF_INET6,
14 };
15 new_socket(domain, SOCK_STREAM)
16 }
17
bind(socket: &net::TcpListener, addr: SocketAddr) -> io::Result<()>18 pub(crate) fn bind(socket: &net::TcpListener, addr: SocketAddr) -> io::Result<()> {
19 use winsock2::bind;
20
21 let (raw_addr, raw_addr_length) = socket_addr(&addr);
22 syscall!(
23 bind(
24 socket.as_raw_socket() as _,
25 raw_addr.as_ptr(),
26 raw_addr_length
27 ),
28 PartialEq::eq,
29 SOCKET_ERROR
30 )?;
31 Ok(())
32 }
33
connect(socket: &net::TcpStream, addr: SocketAddr) -> io::Result<()>34 pub(crate) fn connect(socket: &net::TcpStream, addr: SocketAddr) -> io::Result<()> {
35 use winsock2::connect;
36
37 let (raw_addr, raw_addr_length) = socket_addr(&addr);
38 let res = syscall!(
39 connect(
40 socket.as_raw_socket() as _,
41 raw_addr.as_ptr(),
42 raw_addr_length
43 ),
44 PartialEq::eq,
45 SOCKET_ERROR
46 );
47
48 match res {
49 Err(err) if err.kind() != io::ErrorKind::WouldBlock => Err(err),
50 _ => Ok(()),
51 }
52 }
53
listen(socket: &net::TcpListener, backlog: u32) -> io::Result<()>54 pub(crate) fn listen(socket: &net::TcpListener, backlog: u32) -> io::Result<()> {
55 use std::convert::TryInto;
56 use winsock2::listen;
57
58 let backlog = backlog.try_into().unwrap_or(i32::max_value());
59 syscall!(
60 listen(socket.as_raw_socket() as _, backlog),
61 PartialEq::eq,
62 SOCKET_ERROR
63 )?;
64 Ok(())
65 }
66
accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, SocketAddr)>67 pub(crate) fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, SocketAddr)> {
68 // The non-blocking state of `listener` is inherited. See
69 // https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept#remarks.
70 listener.accept()
71 }
72