X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fldk%2Fbatteries%2FNioPeerHandler.java;h=172eca34a6da20b7634585cefa37f150cf3896ce;hb=ca313f2eee377bec222fa82b2939751fa9eab32e;hp=5963506feddf76b518c41b8a18f31a51fe4b8037;hpb=e4e7f2ffcea8959b21a586f94c4d4eac92fb4cac;p=ldk-java diff --git a/src/main/java/org/ldk/batteries/NioPeerHandler.java b/src/main/java/org/ldk/batteries/NioPeerHandler.java index 5963506f..172eca34 100644 --- a/src/main/java/org/ldk/batteries/NioPeerHandler.java +++ b/src/main/java/org/ldk/batteries/NioPeerHandler.java @@ -6,9 +6,8 @@ import org.ldk.structs.*; import java.io.IOException; import java.lang.reflect.Field; import java.lang.ref.Reference; +import java.net.*; import java.util.LinkedList; -import java.net.SocketAddress; -import java.net.StandardSocketOptions; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.*; @@ -121,6 +120,19 @@ public class NioPeerHandler { long socket_id; volatile boolean shutdown = false; + private static Option_SocketAddressZ get_netaddr_from_sockaddr(java.net.SocketAddress sockaddr) { + if (sockaddr instanceof InetSocketAddress) { + InetAddress addr = ((InetSocketAddress) sockaddr).getAddress(); + short port = (short) ((InetSocketAddress) sockaddr).getPort(); + if (addr instanceof Inet4Address) { + return Option_SocketAddressZ.some(org.ldk.structs.SocketAddress.tcp_ip_v4(addr.getAddress(), port)); + } else if (addr instanceof Inet6Address) { + return Option_SocketAddressZ.some(org.ldk.structs.SocketAddress.tcp_ip_v6(addr.getAddress(), port)); + } + } + return Option_SocketAddressZ.none(); + } + /** * Constructs a new peer handler, spawning a thread to monitor for socket events. * @@ -176,7 +188,8 @@ public class NioPeerHandler { try { Peer peer = setup_socket(chan); peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer); - Result_NonePeerHandleErrorZ res = this.peer_manager.new_inbound_connection(peer.descriptor); + Option_SocketAddressZ netaddr = get_netaddr_from_sockaddr(chan.getRemoteAddress()); + Result_NonePeerHandleErrorZ res = this.peer_manager.new_inbound_connection(peer.descriptor, netaddr); if (res instanceof Result_NonePeerHandleErrorZ.Result_NonePeerHandleErrorZ_Err) { peer.descriptor.disconnect_socket(); } @@ -264,7 +277,7 @@ public class NioPeerHandler { * @param timeout_ms The amount of time, in milliseconds, up to which we will wait for connection to complete. * @throws IOException If connecting to the remote endpoint fails or internal java.nio errors occur. */ - public void connect(byte[] their_node_id, SocketAddress remote, int timeout_ms) throws IOException { + public void connect(byte[] their_node_id, java.net.SocketAddress remote, int timeout_ms) throws IOException { SocketChannel chan = SocketChannel.open(); boolean connected; try { @@ -285,7 +298,7 @@ public class NioPeerHandler { } Peer peer = setup_socket(chan); do_selector_action(() -> peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer)); - Result_CVec_u8ZPeerHandleErrorZ res = this.peer_manager.new_outbound_connection(their_node_id, peer.descriptor); + Result_CVec_u8ZPeerHandleErrorZ res = this.peer_manager.new_outbound_connection(their_node_id, peer.descriptor, get_netaddr_from_sockaddr(remote)); if (res instanceof Result_CVec_u8ZPeerHandleErrorZ.Result_CVec_u8ZPeerHandleErrorZ_OK) { byte[] initial_bytes = ((Result_CVec_u8ZPeerHandleErrorZ.Result_CVec_u8ZPeerHandleErrorZ_OK) res).res; if (chan.write(ByteBuffer.wrap(initial_bytes)) != initial_bytes.length) { @@ -305,7 +318,7 @@ public class NioPeerHandler { * @param their_node_id must be a valid 33-byte public key */ public void disconnect(byte[] their_node_id) { - this.peer_manager.disconnect_by_node_id(their_node_id, false); + this.peer_manager.disconnect_by_node_id(their_node_id); } /** @@ -320,7 +333,7 @@ public class NioPeerHandler { * @param socket_address The address to bind the listening socket to. * @throws IOException if binding the listening socket fail. */ - public void bind_listener(SocketAddress socket_address) throws IOException { + public void bind_listener(java.net.SocketAddress socket_address) throws IOException { ServerSocketChannel listen_channel = ServerSocketChannel.open(); listen_channel.setOption(StandardSocketOptions.SO_REUSEADDR, true); listen_channel.bind(socket_address);