zt_get_address() implementation
This commit is contained in:
@@ -29,6 +29,7 @@ package ZeroTier;
|
|||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
@@ -50,6 +51,7 @@ public class SDK {
|
|||||||
public native void zt_start_service(String homeDir);
|
public native void zt_start_service(String homeDir);
|
||||||
public native void zt_join_network(String nwid);
|
public native void zt_join_network(String nwid);
|
||||||
public native void zt_leave_network(String nwid);
|
public native void zt_leave_network(String nwid);
|
||||||
|
public native ArrayList<String> zt_get_addresses(String nwid);
|
||||||
public native boolean zt_running();
|
public native boolean zt_running();
|
||||||
|
|
||||||
// Direct-call API
|
// Direct-call API
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.support.v7.app.AppCompatActivity;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import android.util.*;
|
import android.util.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import ZeroTier.SDK;
|
import ZeroTier.SDK;
|
||||||
|
|
||||||
@@ -72,28 +73,28 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
// Listen to incoming connections
|
// Listen to incoming connections
|
||||||
if(mode==1)
|
if(mode==1)
|
||||||
{
|
{
|
||||||
|
ArrayList<String> addresses = new ArrayList<String>();
|
||||||
while(err < 0) {
|
while(err < 0) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch(java.lang.InterruptedException e) { }
|
catch(java.lang.InterruptedException e) { }
|
||||||
|
addresses = zt.zt_get_addresses("XXXXXXXXXXXXXXXX");
|
||||||
|
|
||||||
|
if(addresses.size() > 0) {
|
||||||
|
for(int i=0; i<addresses.size(); i++) {
|
||||||
|
Log.d("TEST", "Address = " + addresses.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
err = zt.zt_bind(sock, "0.0.0.0", 8080);
|
err = zt.zt_bind(sock, "0.0.0.0", 8080);
|
||||||
Log.d("TEST", "err = " + err + "\n");
|
Log.d("TEST", "bind_err = " + err + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = zt.zt_listen(sock,1);
|
||||||
|
Log.d("TEST", "listen_err = " + err);
|
||||||
|
|
||||||
//zt.zt_listen(sock,1);
|
err = zt.zt_accept(sock,null); // Pass a ZTAddress to get remote host's address (if you want)
|
||||||
//err = zt.zt_accept(sock,null); // Pass a ZTAddress to get remote host's address (if you want)
|
Log.d("TEST", "accept_err = " + err);
|
||||||
|
|
||||||
//Log.d("TEST", "accept_err = " + err);
|
|
||||||
|
|
||||||
// Example ZTAddress usage
|
|
||||||
/*
|
|
||||||
ZeroTier.ZTAddress za = new ZeroTier.ZTAddress();
|
|
||||||
za.addr = "0.0.0.0";
|
|
||||||
za.port = -1;
|
|
||||||
InetSocketAddress addr = za.ToInetSocketAddress();
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -139,6 +139,8 @@ namespace ZeroTier {
|
|||||||
bool addIp(const InetAddress &ip);
|
bool addIp(const InetAddress &ip);
|
||||||
bool removeIp(const InetAddress &ip);
|
bool removeIp(const InetAddress &ip);
|
||||||
std::vector<InetAddress> ips() const;
|
std::vector<InetAddress> ips() const;
|
||||||
|
std::vector<InetAddress> _ips;
|
||||||
|
|
||||||
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
|
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
|
||||||
std::string deviceName() const;
|
std::string deviceName() const;
|
||||||
void setFriendlyName(const char *friendlyName);
|
void setFriendlyName(const char *friendlyName);
|
||||||
@@ -497,7 +499,6 @@ namespace ZeroTier {
|
|||||||
std::vector<MulticastGroup> _multicastGroups;
|
std::vector<MulticastGroup> _multicastGroups;
|
||||||
Mutex _multicastGroups_m;
|
Mutex _multicastGroups_m;
|
||||||
|
|
||||||
std::vector<InetAddress> _ips;
|
|
||||||
Mutex _ips_m, _tcpconns_m, _rx_buf_m, _close_m;
|
Mutex _ips_m, _tcpconns_m, _rx_buf_m, _close_m;
|
||||||
|
|
||||||
unsigned int _mtu;
|
unsigned int _mtu;
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
#include "OSUtils.hpp"
|
#include "OSUtils.hpp"
|
||||||
|
|
||||||
|
#include "SDK_EthernetTap.hpp"
|
||||||
#include "SDK.h"
|
#include "SDK.h"
|
||||||
#include "SDK_Debug.h"
|
#include "SDK_Debug.h"
|
||||||
#include "SDK_ServiceSetup.hpp"
|
#include "SDK_ServiceSetup.hpp"
|
||||||
@@ -111,6 +112,20 @@ void zts_leave_network(const char * nwid) { zt1Service->leave(nwid); }
|
|||||||
bool zts_is_running() { return zt1Service->isRunning(); }
|
bool zts_is_running() { return zt1Service->isRunning(); }
|
||||||
void zts_terminate() { zt1Service->terminate(); }
|
void zts_terminate() { zt1Service->terminate(); }
|
||||||
|
|
||||||
|
std::vector<std::string> zt_get_addresses(std::string nwid)
|
||||||
|
{
|
||||||
|
uint64_t nwid_int = strtoull(nwid.c_str(), NULL, 16);
|
||||||
|
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||||
|
std::vector<std::string> ip_strings;
|
||||||
|
if(tap) {
|
||||||
|
for(int i=0; i<tap->_ips.size(); i++) {
|
||||||
|
ip_strings.push_back(tap->_ips[i].toString());
|
||||||
|
}
|
||||||
|
return ip_strings;
|
||||||
|
}
|
||||||
|
return ip_strings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Android JNI wrapper
|
// Android JNI wrapper
|
||||||
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
||||||
@@ -138,9 +153,27 @@ void zts_terminate() { zt1Service->terminate(); }
|
|||||||
if(zt1Service)
|
if(zt1Service)
|
||||||
zts_terminate();
|
zts_terminate();
|
||||||
}
|
}
|
||||||
|
JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||||
|
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
|
||||||
|
std::vector<std::string> address_strings = zt_get_addresses(nwid_str);
|
||||||
|
jclass clazz = (*env).FindClass("java/util/ArrayList");
|
||||||
|
jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V"));
|
||||||
|
|
||||||
|
if(address_strings.size()) {
|
||||||
|
for (int n=0;n<address_strings.size();n++) {
|
||||||
|
jstring _str = (*env).NewStringUTF(address_strings[n].c_str());
|
||||||
|
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // Add dummy value
|
||||||
|
jstring _str = (*env).NewStringUTF("-1.-1.-1.-1/-1");
|
||||||
|
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||||
|
}
|
||||||
|
return addresses;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Typically used on iOS/OSX
|
// Typically used on iOS/OSX
|
||||||
#if !defined(__ANDROID__)
|
#if !defined(__ANDROID__)
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -33,12 +33,14 @@ extern "C" {
|
|||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#ifndef ONE_SERVICE_SETUP_HPP
|
#ifndef ONE_SERVICE_SETUP_HPP
|
||||||
#define ONE_SERVICE_SETUP_HPP
|
#define ONE_SERVICE_SETUP_HPP
|
||||||
|
|
||||||
#define INTERCEPT_ENABLED 111
|
#define INTERCEPT_ENABLED 111
|
||||||
#define INTERCEPT_DISABLED 222
|
#define INTERCEPT_DISABLED 222
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
||||||
/* If you define anything else in this file it that you wish to expose to your Android
|
/* If you define anything else in this file it that you wish to expose to your Android
|
||||||
@@ -47,6 +49,7 @@ extern "C" {
|
|||||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj);
|
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj);
|
||||||
|
JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||||
#else
|
#else
|
||||||
void init_service(int key, const char * path);
|
void init_service(int key, const char * path);
|
||||||
void init_service_and_rpc(int key, const char * path, const char * nwid);
|
void init_service_and_rpc(int key, const char * path, const char * nwid);
|
||||||
@@ -64,7 +67,7 @@ void zts_join_network(const char * nwid);
|
|||||||
void zts_leave_network(const char * nwid);
|
void zts_leave_network(const char * nwid);
|
||||||
bool zts_is_running();
|
bool zts_is_running();
|
||||||
void zts_terminate();
|
void zts_terminate();
|
||||||
|
std::vector<std::string> zt_get_addresses(std::string nwid);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -951,6 +951,8 @@ public:
|
|||||||
_phy.whack();
|
_phy.whack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For ZT SDK API
|
||||||
|
|
||||||
virtual void join(const char *hp)
|
virtual void join(const char *hp)
|
||||||
{
|
{
|
||||||
_node->join(Utils::hexStrToU64(hp),NULL);
|
_node->join(Utils::hexStrToU64(hp),NULL);
|
||||||
@@ -966,6 +968,11 @@ public:
|
|||||||
return _homePath;
|
return _homePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual std::map< uint64_t,EthernetTap * > getTaps()
|
||||||
|
{
|
||||||
|
return _taps;
|
||||||
|
}
|
||||||
|
|
||||||
// Begin private implementation methods
|
// Begin private implementation methods
|
||||||
|
|
||||||
inline void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *localAddr,const struct sockaddr *from,void *data,unsigned long len)
|
inline void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *localAddr,const struct sockaddr *from,void *data,unsigned long len)
|
||||||
|
|||||||
@@ -20,6 +20,14 @@
|
|||||||
#define ZT_ONESERVICE_HPP
|
#define ZT_ONESERVICE_HPP
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
// Include the right tap device driver for this platform -- add new platforms here
|
||||||
|
#ifdef SDK
|
||||||
|
// In network containers builds, use the virtual netcon endpoint instead of a tun/tap port driver
|
||||||
|
#include "../src/SDK_EthernetTap.hpp"
|
||||||
|
namespace ZeroTier { typedef NetconEthernetTap EthernetTap; }
|
||||||
|
#endif // not ZT_SDK so pick a tap driver
|
||||||
|
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
@@ -146,6 +154,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual std::string givenHomePath() = 0;
|
virtual std::string givenHomePath() = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual std::map< uint64_t,EthernetTap * > getTaps() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return True if service is still running
|
* @return True if service is still running
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user