@@ -178,6 +178,13 @@ fn socket_addr_to_c(addr: &SocketAddr) -> (SocketAddrCRepr, c::socklen_t) {
178178 }
179179}
180180
181+ fn addr_family ( addr : & SocketAddr ) -> c_int {
182+ match addr {
183+ SocketAddr :: V4 ( ..) => c:: AF_INET ,
184+ SocketAddr :: V6 ( ..) => c:: AF_INET6 ,
185+ }
186+ }
187+
181188/// Converts the C socket address stored in `storage` to a Rust `SocketAddr`.
182189///
183190/// # Safety
@@ -364,7 +371,7 @@ impl TcpStream {
364371 return each_addr ( addr, inner) ;
365372
366373 fn inner ( addr : & SocketAddr ) -> io:: Result < TcpStream > {
367- let sock = Socket :: new ( addr, c:: SOCK_STREAM ) ?;
374+ let sock = Socket :: new ( addr_family ( addr) , c:: SOCK_STREAM ) ?;
368375 sock. connect ( addr) ?;
369376 Ok ( TcpStream { inner : sock } )
370377 }
@@ -373,7 +380,7 @@ impl TcpStream {
373380 pub fn connect_timeout ( addr : & SocketAddr , timeout : Duration ) -> io:: Result < TcpStream > {
374381 init ( ) ;
375382
376- let sock = Socket :: new ( addr, c:: SOCK_STREAM ) ?;
383+ let sock = Socket :: new ( addr_family ( addr) , c:: SOCK_STREAM ) ?;
377384 sock. connect_timeout ( addr, timeout) ?;
378385 Ok ( TcpStream { inner : sock } )
379386 }
@@ -535,7 +542,7 @@ impl TcpListener {
535542 return each_addr ( addr, inner) ;
536543
537544 fn inner ( addr : & SocketAddr ) -> io:: Result < TcpListener > {
538- let sock = Socket :: new ( addr, c:: SOCK_STREAM ) ?;
545+ let sock = Socket :: new ( addr_family ( addr) , c:: SOCK_STREAM ) ?;
539546
540547 // On platforms with Berkeley-derived sockets, this allows to quickly
541548 // rebind a socket, without needing to wait for the OS to clean up the
@@ -661,7 +668,7 @@ impl UdpSocket {
661668 return each_addr ( addr, inner) ;
662669
663670 fn inner ( addr : & SocketAddr ) -> io:: Result < UdpSocket > {
664- let sock = Socket :: new ( addr, c:: SOCK_DGRAM ) ?;
671+ let sock = Socket :: new ( addr_family ( addr) , c:: SOCK_DGRAM ) ?;
665672 let ( addr, len) = socket_addr_to_c ( addr) ;
666673 cvt ( unsafe { c:: bind ( sock. as_raw ( ) , addr. as_ptr ( ) , len as _ ) } ) ?;
667674 Ok ( UdpSocket { inner : sock } )
0 commit comments