@@ -958,6 +958,33 @@ impl From<std::net::SocketAddr> for SocketAddress {
958
958
}
959
959
}
960
960
961
+ #[ cfg( feature = "std" ) ]
962
+ impl std:: net:: ToSocketAddrs for SocketAddress {
963
+ type Iter = std:: option:: IntoIter < std:: net:: SocketAddr > ;
964
+
965
+ fn to_socket_addrs ( & self ) -> std:: io:: Result < Self :: Iter > {
966
+ match self {
967
+ SocketAddress :: TcpIpV4 { addr, port } => {
968
+ let ip_addr = std:: net:: Ipv4Addr :: from ( * addr) ;
969
+ ( ip_addr, * port) . to_socket_addrs ( )
970
+ }
971
+ SocketAddress :: TcpIpV6 { addr, port } => {
972
+ let ip_addr = std:: net:: Ipv6Addr :: from ( * addr) ;
973
+ ( ip_addr, * port) . to_socket_addrs ( )
974
+ }
975
+ SocketAddress :: Hostname { ref hostname, port } => {
976
+ Ok ( ( hostname. as_str ( ) , * port) . to_socket_addrs ( ) ?. next ( ) . into_iter ( ) )
977
+ }
978
+ SocketAddress :: OnionV2 ( ..) => {
979
+ Err ( std:: io:: Error :: from ( std:: io:: ErrorKind :: Unsupported ) )
980
+ }
981
+ SocketAddress :: OnionV3 { .. } => {
982
+ Err ( std:: io:: Error :: from ( std:: io:: ErrorKind :: Unsupported ) )
983
+ }
984
+ }
985
+ }
986
+ }
987
+
961
988
/// Parses an OnionV3 host and port into a [`SocketAddress::OnionV3`].
962
989
///
963
990
/// The host part must end with ".onion".
@@ -2676,7 +2703,7 @@ mod tests {
2676
2703
use crate :: chain:: transaction:: OutPoint ;
2677
2704
2678
2705
#[ cfg( feature = "std" ) ]
2679
- use std:: net:: { Ipv4Addr , Ipv6Addr } ;
2706
+ use std:: net:: { Ipv4Addr , Ipv6Addr , SocketAddr , ToSocketAddrs } ;
2680
2707
use crate :: ln:: msgs:: SocketAddressParseError ;
2681
2708
2682
2709
#[ test]
@@ -4105,4 +4132,27 @@ mod tests {
4105
4132
assert ! ( "invalid-address" . parse:: <SocketAddress >( ) . is_err( ) ) ;
4106
4133
assert ! ( SocketAddress :: from_str( "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion.onion:1234" ) . is_err( ) ) ;
4107
4134
}
4135
+
4136
+ #[ test]
4137
+ #[ cfg( feature = "std" ) ]
4138
+ fn test_socket_address_to_socket_addrs ( ) {
4139
+ assert_eq ! ( SocketAddress :: TcpIpV4 { addr: [ 0u8 ; 4 ] , port: 1337 , } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4140
+ SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new( std:: net:: Ipv4Addr :: new( 0 , 0 , 0 , 0 ) ,
4141
+ 1337 ) ) ) ;
4142
+ assert_eq ! ( SocketAddress :: TcpIpV6 { addr: [ 0u8 ; 16 ] , port: 1337 , } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4143
+ SocketAddr :: V6 ( std:: net:: SocketAddrV6 :: new( std:: net:: Ipv6Addr :: from( [ 0u8 ; 16 ] ) ,
4144
+ 1337 , 0 , 0 ) ) ) ;
4145
+ assert_eq ! ( SocketAddress :: Hostname { hostname: Hostname :: try_from( "0.0.0.0" . to_string( ) ) . unwrap( ) , port: 0
4146
+ } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4147
+ std:: net:: SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new(
4148
+ std:: net:: Ipv4Addr :: from( [ 0u8 ; 4 ] ) , 0 ) ) ) ;
4149
+ assert ! ( SocketAddress :: OnionV2 ( [ 0u8 ; 12 ] ) . to_socket_addrs( ) . is_err( ) ) ;
4150
+ assert ! ( SocketAddress :: OnionV3 {
4151
+ ed25519_pubkey: [ 37 , 24 , 75 , 5 , 25 , 73 , 117 , 194 , 139 , 102 , 182 , 107 , 4 , 105 , 247 , 246 , 85 ,
4152
+ 111 , 177 , 172 , 49 , 137 , 167 , 155 , 64 , 221 , 163 , 47 , 31 , 33 , 71 , 3 ] ,
4153
+ checksum: 48326 ,
4154
+ version: 121 ,
4155
+ port: 1234
4156
+ } . to_socket_addrs( ) . is_err( ) ) ;
4157
+ }
4108
4158
}
0 commit comments