You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.2 KiB
219 lines
6.2 KiB
/* |
|
* Copyright (c)2013-2021 ZeroTier, Inc. |
|
* |
|
* Use of this software is governed by the Business Source License included |
|
* in the LICENSE.TXT file in the project's root directory. |
|
* |
|
* Change Date: 2026-01-01 |
|
* |
|
* On the date above, in accordance with the Business Source License, use |
|
* of this software will be governed by version 2.0 of the Apache License. |
|
*/ |
|
/****/ |
|
|
|
package com.zerotier.sockets; |
|
|
|
import com.zerotier.sockets.*; |
|
import java.io.*; |
|
import java.net.*; |
|
|
|
/** |
|
* Implements SocketServer-like behavior over ZeroTier |
|
* |
|
* @author ZeroTier, Inc. |
|
*/ |
|
public class ZeroTierServerSocket { |
|
private ZeroTierSocket _socket; |
|
|
|
/** |
|
* Create an unbound ZeroTierServerSocket |
|
*/ |
|
public ZeroTierServerSocket() throws IOException |
|
{ |
|
_socket = new ZeroTierSocket(ZeroTierNative.ZTS_AF_INET6, ZeroTierNative.ZTS_SOCK_STREAM, 0); |
|
} |
|
|
|
/** |
|
* Create a ZeroTierServerSocket bound to the given port |
|
*/ |
|
public ZeroTierServerSocket(int localPort) throws IOException |
|
{ |
|
_socket = new ZeroTierSocket(ZeroTierNative.ZTS_AF_INET6, ZeroTierNative.ZTS_SOCK_STREAM, 0); |
|
_socket.bind("::", localPort); |
|
_socket.listen(0); |
|
} |
|
|
|
/** |
|
* Create a ZeroTierServerSocket bound to the given port with a backlog |
|
*/ |
|
public ZeroTierServerSocket(int localPort, int backlog) throws IOException |
|
{ |
|
_socket = new ZeroTierSocket(ZeroTierNative.ZTS_AF_INET6, ZeroTierNative.ZTS_SOCK_STREAM, 0); |
|
_socket.bind("::", localPort); |
|
_socket.listen(backlog); |
|
} |
|
|
|
/** |
|
* Create a ZeroTierServerSocket bound to the given port and local address |
|
*/ |
|
public ZeroTierServerSocket(int localPort, int backlog, InetAddress localAddr) throws IOException |
|
{ |
|
_socket = new ZeroTierSocket(ZeroTierNative.ZTS_AF_INET6, ZeroTierNative.ZTS_SOCK_STREAM, 0); |
|
_socket.bind(localAddr.getHostAddress(), localPort); |
|
_socket.listen(backlog); |
|
} |
|
|
|
/** |
|
* Accept incoming connections on this ZeroTierSocket |
|
* @return New ZeroTierSocket representing the accepted connection |
|
* @exception IOException when an I/O error occurs |
|
*/ |
|
public ZeroTierSocket accept() throws IOException |
|
{ |
|
return _socket.accept(); |
|
} |
|
|
|
/** |
|
* Bind to a local address |
|
* @param localAddr Local address to which this socket should bind |
|
* @param localPort Local port to which this socket should bind |
|
* |
|
* @exception IOException when an I/O error occurs |
|
*/ |
|
public void bind(SocketAddress localAddr) throws IOException |
|
{ |
|
InetSocketAddress inetAddr = (InetSocketAddress)localAddr; |
|
_socket.bind(inetAddr.getHostName(), inetAddr.getPort()); |
|
} |
|
|
|
/** |
|
* Bind to a local address |
|
* @param localAddr Local address to which this socket should bind |
|
* @param localPort Local port to which this socket should bind |
|
* |
|
* @exception IOException when an I/O error occurs |
|
*/ |
|
public void bind(SocketAddress localAddr, int backlog) throws IOException |
|
{ |
|
InetSocketAddress inetAddr = (InetSocketAddress)localAddr; |
|
_socket.bind(inetAddr.getHostName(), inetAddr.getPort()); |
|
} |
|
|
|
/** |
|
* Close the ZeroTierSocket. |
|
* |
|
* @exception IOException when an I/O error occurs |
|
*/ |
|
public void close() throws IOException |
|
{ |
|
_socket.close(); |
|
} |
|
|
|
/** |
|
* Get the remote address to which this ZeroTierSocket is bound |
|
* @return Remote address |
|
*/ |
|
public InetAddress getInetAddress() |
|
{ |
|
return _socket.getLocalAddress(); |
|
} |
|
|
|
/** |
|
* Get the local port to which this ZeroTierSocket is bound |
|
* @return Local port |
|
*/ |
|
public int getLocalPort() |
|
{ |
|
return _socket.getLocalPort(); |
|
} |
|
|
|
/** |
|
* Get the local address to which this ZeroTierSocket is bound |
|
* @return Local address |
|
*/ |
|
public SocketAddress getLocalSocketAddress() |
|
{ |
|
return _socket.getLocalSocketAddress(); |
|
} |
|
|
|
/** |
|
* Return the size of the receive buffer for the ZeroTierSocket's ZeroTierInputStream (SO_RCVBUF) |
|
* @return Size of the receive buffer |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public int getReceiveBufferSize() throws IOException |
|
{ |
|
return _socket.getReceiveBufferSize(); |
|
} |
|
|
|
/** |
|
* Return whether address reuse is enabled on this ZeroTierSocket (SO_REUSEADDR) |
|
* @return true or false |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public boolean getReuseAddress() throws IOException |
|
{ |
|
return _socket.getReuseAddress(); |
|
} |
|
|
|
/** |
|
* Get the ZeroTierSocket's timeout value (SO_RCVTIMEO) |
|
* @return Nothing. |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public int getSoTimeout() throws IOException |
|
{ |
|
return _socket.getSoTimeout(); |
|
} |
|
|
|
/** |
|
* Return whether this ZeroTierSocket is bound to a local address |
|
* @return true or false |
|
*/ |
|
public boolean isBound() |
|
{ |
|
return _socket.isBound(); |
|
} |
|
|
|
/** |
|
* Return whether this ZeroTierSocket has been closed |
|
* @return true or false |
|
*/ |
|
public boolean isClosed() |
|
{ |
|
return _socket.isClosed(); |
|
} |
|
|
|
/** |
|
* Set the size of the receive buffer for the ZeroTierSocket's ZeroTierInputStream. |
|
* @param bufferSize Size of receive buffer |
|
* |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public void setReceiveBufferSize(int bufferSize) throws IOException |
|
{ |
|
_socket.setReceiveBufferSize(bufferSize); |
|
} |
|
|
|
/** |
|
* Enable or disable the re-use of addresses (SO_REUSEADDR) |
|
* @param enabled Whether SO_REUSEADDR is enabled |
|
* |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public void setReuseAddress(boolean enabled) throws IOException |
|
{ |
|
_socket.setReuseAddress(enabled); |
|
} |
|
|
|
/** |
|
* Set the timeout value for SO_RCVTIMEO |
|
* @param timeout Socket receive timeout value. |
|
* |
|
* @exception SocketException when an error occurs in the native socket layer |
|
*/ |
|
public void setSoTimeout(int timeout) throws IOException |
|
{ |
|
_socket.setSoTimeout(timeout); |
|
} |
|
}
|
|
|