@@ -956,6 +956,33 @@ impl From<std::net::SocketAddr> for SocketAddress {
956
956
}
957
957
}
958
958
959
+ #[ cfg( feature = "std" ) ]
960
+ impl std:: net:: ToSocketAddrs for SocketAddress {
961
+ type Iter = std:: option:: IntoIter < std:: net:: SocketAddr > ;
962
+
963
+ fn to_socket_addrs ( & self ) -> std:: io:: Result < Self :: Iter > {
964
+ match self {
965
+ SocketAddress :: TcpIpV4 { addr, port } => {
966
+ let ip_addr = std:: net:: Ipv4Addr :: from ( * addr) ;
967
+ ( ip_addr, * port) . to_socket_addrs ( )
968
+ }
969
+ SocketAddress :: TcpIpV6 { addr, port } => {
970
+ let ip_addr = std:: net:: Ipv6Addr :: from ( * addr) ;
971
+ ( ip_addr, * port) . to_socket_addrs ( )
972
+ }
973
+ SocketAddress :: Hostname { ref hostname, port } => {
974
+ Ok ( ( hostname. as_str ( ) , * port) . to_socket_addrs ( ) ?. next ( ) . into_iter ( ) )
975
+ }
976
+ SocketAddress :: OnionV2 ( ..) => {
977
+ Err ( std:: io:: Error :: from ( std:: io:: ErrorKind :: Unsupported ) )
978
+ }
979
+ SocketAddress :: OnionV3 { .. } => {
980
+ Err ( std:: io:: Error :: from ( std:: io:: ErrorKind :: Unsupported ) )
981
+ }
982
+ }
983
+ }
984
+ }
985
+
959
986
fn parse_onion_address ( host : & str , port : u16 ) -> Result < SocketAddress , SocketAddressParseError > {
960
987
if host. ends_with ( ".onion" ) {
961
988
let domain = & host[ ..host. len ( ) - ".onion" . len ( ) ] ;
@@ -2671,7 +2698,7 @@ mod tests {
2671
2698
use crate :: chain:: transaction:: OutPoint ;
2672
2699
2673
2700
#[ cfg( feature = "std" ) ]
2674
- use std:: net:: { Ipv4Addr , Ipv6Addr } ;
2701
+ use std:: net:: { Ipv4Addr , Ipv6Addr , SocketAddr , ToSocketAddrs } ;
2675
2702
use crate :: ln:: msgs:: SocketAddressParseError ;
2676
2703
2677
2704
#[ test]
@@ -4100,4 +4127,27 @@ mod tests {
4100
4127
assert ! ( "invalid-address" . parse:: <SocketAddress >( ) . is_err( ) ) ;
4101
4128
assert ! ( SocketAddress :: from_str( "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion.onion:1234" ) . is_err( ) ) ;
4102
4129
}
4130
+
4131
+ #[ test]
4132
+ #[ cfg( feature = "std" ) ]
4133
+ fn test_socket_address_to_socket_addrs ( ) {
4134
+ assert_eq ! ( SocketAddress :: TcpIpV4 { addr: [ 0u8 ; 4 ] , port: 1337 , } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4135
+ SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new( std:: net:: Ipv4Addr :: new( 0 , 0 , 0 , 0 ) ,
4136
+ 1337 ) ) ) ;
4137
+ assert_eq ! ( SocketAddress :: TcpIpV6 { addr: [ 0u8 ; 16 ] , port: 1337 , } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4138
+ SocketAddr :: V6 ( std:: net:: SocketAddrV6 :: new( std:: net:: Ipv6Addr :: from( [ 0u8 ; 16 ] ) ,
4139
+ 1337 , 0 , 0 ) ) ) ;
4140
+ assert_eq ! ( SocketAddress :: Hostname { hostname: Hostname :: try_from( "0.0.0.0" . to_string( ) ) . unwrap( ) , port: 0
4141
+ } . to_socket_addrs( ) . unwrap( ) . next( ) . unwrap( ) ,
4142
+ std:: net:: SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new(
4143
+ std:: net:: Ipv4Addr :: from( [ 0u8 ; 4 ] ) , 0 ) ) ) ;
4144
+ assert ! ( SocketAddress :: OnionV2 ( [ 0u8 ; 12 ] ) . to_socket_addrs( ) . is_err( ) ) ;
4145
+ assert ! ( SocketAddress :: OnionV3 {
4146
+ ed25519_pubkey: [ 37 , 24 , 75 , 5 , 25 , 73 , 117 , 194 , 139 , 102 , 182 , 107 , 4 , 105 , 247 , 246 , 85 ,
4147
+ 111 , 177 , 172 , 49 , 137 , 167 , 155 , 64 , 221 , 163 , 47 , 31 , 33 , 71 , 3 ] ,
4148
+ checksum: 48326 ,
4149
+ version: 121 ,
4150
+ port: 1234
4151
+ } . to_socket_addrs( ) . is_err( ) ) ;
4152
+ }
4103
4153
}
0 commit comments