diff --git a/src/net.rs b/src/net.rs index 95ee93a..fd1092b 100644 --- a/src/net.rs +++ b/src/net.rs @@ -13,8 +13,9 @@ use std::os::windows::prelude::*; use net2::TcpBuilder; use winapi::*; -use winapi::shared::inaddr::{in_addr_S_un, IN_ADDR}; -use winapi::shared::in6addr::{in6_addr_u, IN6_ADDR}; +use winapi::inaddr::IN_ADDR; +use winapi::ws2def::SOCKADDR_IN; +use winapi::ws2ipdef::{in6_addr, sockaddr_in6}; use ws2_32::*; /// A type to represent a buffer in which a socket address will be stored. @@ -487,7 +488,7 @@ fn cvt(i: c_int, size: DWORD) -> io::Result> { #[repr(C)] pub(crate) union SocketAddrCRepr { v4: SOCKADDR_IN, - v6: SOCKADDR_IN6_LH, + v6: sockaddr_in6, } impl SocketAddrCRepr { @@ -499,16 +500,10 @@ impl SocketAddrCRepr { fn socket_addr_to_ptrs(addr: &SocketAddr) -> (SocketAddrCRepr, c_int) { match *addr { SocketAddr::V4(ref a) => { - let sin_addr = unsafe { - let mut s_un = mem::zeroed::(); - *s_un.S_addr_mut() = u32::from_ne_bytes(a.ip().octets()); - IN_ADDR { S_un: s_un } - }; - let sockaddr_in = SOCKADDR_IN { sin_family: AF_INET as ADDRESS_FAMILY, sin_port: a.port().to_be(), - sin_addr, + sin_addr: IN_ADDR { S_un: u32::from_ne_bytes(a.ip().octets()) }, sin_zero: [0; 8], }; @@ -516,27 +511,16 @@ fn socket_addr_to_ptrs(addr: &SocketAddr) -> (SocketAddrCRepr, c_int) { (sockaddr, mem::size_of::() as c_int) } SocketAddr::V6(ref a) => { - let sin6_addr = unsafe { - let mut u = mem::zeroed::(); - *u.Byte_mut() = a.ip().octets(); - IN6_ADDR { u } - }; - let u = unsafe { - let mut u = mem::zeroed::(); - *u.sin6_scope_id_mut() = a.scope_id(); - u - }; - - let sockaddr_in6 = SOCKADDR_IN6_LH { - sin6_family: AF_INET6 as ADDRESS_FAMILY, + let sockaddr_in6 = sockaddr_in6 { + sin6_family: AF_INET6 as i16, sin6_port: a.port().to_be(), - sin6_addr, + sin6_addr: in6_addr { s6_addr: a.ip().octets() }, sin6_flowinfo: a.flowinfo(), - u, + sin6_scope_id: a.scope_id(), }; let sockaddr = SocketAddrCRepr { v6: sockaddr_in6 }; - (sockaddr, mem::size_of::() as c_int) + (sockaddr, mem::size_of::() as c_int) } } }