From 677ade4358d810e1d82ace30d3135b4133fa9581 Mon Sep 17 00:00:00 2001 From: janvanbouwel Date: Wed, 22 Feb 2023 16:02:43 +0100 Subject: [PATCH 1/5] Set ZeroTierSocketAddress to public. This is used in the ZeroTierNative API which is exposed, but it wasn't itself, making for example `zts_bsd_sendto` impossible to use. --- src/bindings/java/ZeroTierSocketAddress.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings/java/ZeroTierSocketAddress.java b/src/bindings/java/ZeroTierSocketAddress.java index 21a278e9..73189020 100644 --- a/src/bindings/java/ZeroTierSocketAddress.java +++ b/src/bindings/java/ZeroTierSocketAddress.java @@ -21,7 +21,7 @@ * You (as a consumer of this library) should probably not use this as it is non-standard * and very likely to be removed at some point. */ -class ZeroTierSocketAddress { +public class ZeroTierSocketAddress { private byte[] _ip6 = new byte[16]; private byte[] _ip4 = new byte[4]; From 14eb2b4599c6dbb6998f7eee4013b485b97e7c4b Mon Sep 17 00:00:00 2001 From: janvanbouwel Date: Wed, 22 Feb 2023 16:08:50 +0100 Subject: [PATCH 2/5] Fix Socket setSoTimeout According to JavaSockets.cxx, timeout is specified in seconds and microseconds. According to Java spec, setSoTimeout is specified as milliseconds. --- src/bindings/java/ZeroTierSocket.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bindings/java/ZeroTierSocket.java b/src/bindings/java/ZeroTierSocket.java index ffedb3bc..51141e41 100644 --- a/src/bindings/java/ZeroTierSocket.java +++ b/src/bindings/java/ZeroTierSocket.java @@ -644,8 +644,7 @@ public void setSoTimeout(int timeout) throws SocketException if (timeout < 0) { throw new IllegalArgumentException("Error: SO_TIMEOUT < 0"); } - // TODO: This is incorrect - if (ZeroTierNative.zts_set_recv_timeout(_zfd, timeout, timeout) != ZeroTierNative.ZTS_ERR_OK) { + if (ZeroTierNative.zts_set_recv_timeout(_zfd, timeout/1000, (timeout % 1000) * 1000) != ZeroTierNative.ZTS_ERR_OK) { throw new SocketException("Error: Could not set SO_RCVTIMEO"); } } From 616f4897ed16fb5c65c7cff38e3cf858c2b9a374 Mon Sep 17 00:00:00 2001 From: janvanbouwel Date: Wed, 22 Feb 2023 18:29:53 +0100 Subject: [PATCH 3/5] Make java sockets implement Closeable This allows Java's try-with-resource (or Kotlin's use). close() was already there anyways --- src/bindings/java/ZeroTierDatagramSocket.java | 2 +- src/bindings/java/ZeroTierServerSocket.java | 2 +- src/bindings/java/ZeroTierSocket.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bindings/java/ZeroTierDatagramSocket.java b/src/bindings/java/ZeroTierDatagramSocket.java index a37608d0..28e42e04 100644 --- a/src/bindings/java/ZeroTierDatagramSocket.java +++ b/src/bindings/java/ZeroTierDatagramSocket.java @@ -22,7 +22,7 @@ * * @author ZeroTier, Inc. */ -public class ZeroTierDatagramSocket { +public class ZeroTierDatagramSocket implements Closeable { ZeroTierSocket _socket; /** diff --git a/src/bindings/java/ZeroTierServerSocket.java b/src/bindings/java/ZeroTierServerSocket.java index ac1e25ff..743b1c56 100644 --- a/src/bindings/java/ZeroTierServerSocket.java +++ b/src/bindings/java/ZeroTierServerSocket.java @@ -22,7 +22,7 @@ * * @author ZeroTier, Inc. */ -public class ZeroTierServerSocket { +public class ZeroTierServerSocket implements Closeable { private ZeroTierSocket _socket; /** diff --git a/src/bindings/java/ZeroTierSocket.java b/src/bindings/java/ZeroTierSocket.java index 51141e41..43bc041d 100644 --- a/src/bindings/java/ZeroTierSocket.java +++ b/src/bindings/java/ZeroTierSocket.java @@ -22,7 +22,7 @@ * * @author ZeroTier, Inc. */ -public class ZeroTierSocket { +public class ZeroTierSocket implements Closeable { // File descriptor from lower native layer private int _zfd = -1; private int _family = -1; From 002748b1e6766a77699999af973a937853b756fd Mon Sep 17 00:00:00 2001 From: janvanbouwel Date: Wed, 22 Feb 2023 20:29:18 +0100 Subject: [PATCH 4/5] Update setSoTimeout documentation --- src/bindings/java/ZeroTierSocket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings/java/ZeroTierSocket.java b/src/bindings/java/ZeroTierSocket.java index 43bc041d..f044ef8a 100644 --- a/src/bindings/java/ZeroTierSocket.java +++ b/src/bindings/java/ZeroTierSocket.java @@ -632,7 +632,7 @@ public void setSoLinger(boolean enabled, int lingerTime) throws SocketException /** * Set the timeout value for SO_RCVTIMEO - * @param timeout Socket receive timeout value. + * @param timeout Socket receive timeout value in milliseconds. * * @exception SocketException when an error occurs in the native socket layer */ From 8d1f59a4af55571e655d25126fbbc1e640165f64 Mon Sep 17 00:00:00 2001 From: janvanbouwel Date: Fri, 24 Feb 2023 01:10:13 +0100 Subject: [PATCH 5/5] Add remote address to SocketServer.accept (as that information was being thrown away). Also adds toInetAddress to ZeroTierSocketAddress, as otherwise you'd have to convert first to String and then to InetAddress, but the String conversion itself uses InetAddress. --- src/bindings/java/ZeroTierSocket.java | 6 +++-- src/bindings/java/ZeroTierSocketAddress.java | 24 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/bindings/java/ZeroTierSocket.java b/src/bindings/java/ZeroTierSocket.java index f044ef8a..e5e054a2 100644 --- a/src/bindings/java/ZeroTierSocket.java +++ b/src/bindings/java/ZeroTierSocket.java @@ -58,11 +58,13 @@ public int getNativeFileDescriptor() return _zfd; } - private ZeroTierSocket(int family, int type, int protocol, int zfd) + private ZeroTierSocket(int family, int type, int protocol, int zfd, ZeroTierSocketAddress remoteAddr) { _family = family; _type = type; _protocol = protocol; + _remoteAddr = remoteAddr.toInetAddress(); + _remotePort = remoteAddr.getPort(); setNativeFileDescriptor(zfd); // Since we only call this from accept() we will mark it as connected _isConnected = true; @@ -237,7 +239,7 @@ public ZeroTierSocket accept() throws IOException if ((accetpedFd = ZeroTierNative.zts_bsd_accept(_zfd, addr)) < 0) { throw new IOException("Error while accepting connection (" + accetpedFd + ")"); } - return new ZeroTierSocket(_family, _type, _protocol, accetpedFd); + return new ZeroTierSocket(_family, _type, _protocol, accetpedFd, addr); } /** diff --git a/src/bindings/java/ZeroTierSocketAddress.java b/src/bindings/java/ZeroTierSocketAddress.java index 73189020..e84dfc87 100644 --- a/src/bindings/java/ZeroTierSocketAddress.java +++ b/src/bindings/java/ZeroTierSocketAddress.java @@ -84,6 +84,30 @@ public String ipString() return ""; } + /** + * Convert to InetAddress + */ + public InetAddress toInetAddress() + { + if (_family == ZeroTierNative.ZTS_AF_INET) { + try { + return InetAddress.getByAddress(_ip4); + } + catch (Exception e) { + System.out.println(e); + } + } + if (_family == ZeroTierNative.ZTS_AF_INET6) { + try { + return InetAddress.getByAddress(_ip6); + } + catch (Exception e) { + System.out.println(e); + } + } + return null; + } + /** * Convert to string (ip and port) */