@@ -178,6 +178,13 @@ fn socket_addr_to_c(addr: &SocketAddr) -> (SocketAddrCRepr, c::socklen_t) {
178
178
}
179
179
}
180
180
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
+
181
188
/// Converts the C socket address stored in `storage` to a Rust `SocketAddr`.
182
189
///
183
190
/// # Safety
@@ -364,7 +371,7 @@ impl TcpStream {
364
371
return each_addr ( addr, inner) ;
365
372
366
373
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 ) ?;
368
375
sock. connect ( addr) ?;
369
376
Ok ( TcpStream { inner : sock } )
370
377
}
@@ -373,7 +380,7 @@ impl TcpStream {
373
380
pub fn connect_timeout ( addr : & SocketAddr , timeout : Duration ) -> io:: Result < TcpStream > {
374
381
init ( ) ;
375
382
376
- let sock = Socket :: new ( addr, c:: SOCK_STREAM ) ?;
383
+ let sock = Socket :: new ( addr_family ( addr) , c:: SOCK_STREAM ) ?;
377
384
sock. connect_timeout ( addr, timeout) ?;
378
385
Ok ( TcpStream { inner : sock } )
379
386
}
@@ -535,7 +542,7 @@ impl TcpListener {
535
542
return each_addr ( addr, inner) ;
536
543
537
544
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 ) ?;
539
546
540
547
// On platforms with Berkeley-derived sockets, this allows to quickly
541
548
// rebind a socket, without needing to wait for the OS to clean up the
@@ -661,7 +668,7 @@ impl UdpSocket {
661
668
return each_addr ( addr, inner) ;
662
669
663
670
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 ) ?;
665
672
let ( addr, len) = socket_addr_to_c ( addr) ;
666
673
cvt ( unsafe { c:: bind ( sock. as_raw ( ) , addr. as_ptr ( ) , len as _ ) } ) ?;
667
674
Ok ( UdpSocket { inner : sock } )
0 commit comments