Unity3D integration updates
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<ProductVersion>10.0.20506</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<RootNamespace></RootNamespace>
|
||||
<ProjectGuid>{24F9E71C-1810-2FEA-B9CC-4258EB20D4CD}</ProjectGuid>
|
||||
<ProjectGuid>{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<AssemblyName>Assembly-CSharp-Editor</AssemblyName>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>Temp\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_3_5;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX</DefineConstants>
|
||||
<DefineConstants>DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_3_5;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;UNITY_TEAM_LICENSE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>0169</NoWarn>
|
||||
@@ -48,7 +48,7 @@
|
||||
<Compile Include="Assets\OBJ-IO\Editor\OBJEditor.cs" />
|
||||
<None Include="Assets\OBJ-IO\Readme.txt" />
|
||||
<Reference Include="Assembly-UnityScript">
|
||||
<HintPath>/Users/Joseph/ZeroTier-Unity3D-Test/Library/ScriptAssemblies/Assembly-UnityScript.dll</HintPath>
|
||||
<HintPath>/Users/Joseph/code/ZeroTierSDK/integrations/Unity3D/Library/ScriptAssemblies/Assembly-UnityScript.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.Networking">
|
||||
<HintPath>/Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll</HintPath>
|
||||
@@ -95,7 +95,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="Assembly-CSharp.csproj">
|
||||
<Project>{5AB900A8-5B14-044A-A52D-10417305A5D2}</Project> <Name>Assembly-CSharp</Name> </ProjectReference>
|
||||
<Project>{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}</Project> <Name>Assembly-CSharp</Name> </ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<ProductVersion>10.0.20506</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<RootNamespace></RootNamespace>
|
||||
<ProjectGuid>{5AB900A8-5B14-044A-A52D-10417305A5D2}</ProjectGuid>
|
||||
<ProjectGuid>{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<AssemblyName>Assembly-CSharp</AssemblyName>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>Temp\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_3_5;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX</DefineConstants>
|
||||
<DefineConstants>DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_3_5;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;UNITY_TEAM_LICENSE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn>0169</NoWarn>
|
||||
@@ -45,7 +45,6 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Assets\Demo.cs" />
|
||||
<Compile Include="Assets\MyZeroTier.cs" />
|
||||
<Compile Include="Assets\OBJ-IO\Examples\Scripts\Example.cs" />
|
||||
<Compile Include="Assets\OBJ-IO\Plugins\Extension\GameObjectExtension.cs" />
|
||||
@@ -63,7 +62,8 @@
|
||||
<Compile Include="Assets\OBJ-IO\Plugins\Mesh\OBJ\OBJMaterial.cs" />
|
||||
<Compile Include="Assets\OBJ-IO\Plugins\Utils\Int32Converter.cs" />
|
||||
<Compile Include="Assets\WorldMain.cs" />
|
||||
<Compile Include="Assets\ZeroTier.cs" />
|
||||
<Compile Include="Assets\ZeroTierNetworkInterface.cs" />
|
||||
<Compile Include="Assets\ZeroTierSockets_Demo.cs" />
|
||||
<Compile Include="Assets\ZeroTierUtils.cs" />
|
||||
<None Include="Assets\OBJ-IO\Readme.txt" />
|
||||
<Reference Include="UnityEngine.Networking">
|
||||
|
||||
@@ -1,167 +0,0 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Threading;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.IO;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
public class Demo : MonoBehaviour
|
||||
{
|
||||
public float speed = 300f;
|
||||
|
||||
private ZeroTierNetworkInterface zt;
|
||||
string nwid = "";
|
||||
|
||||
int server_connection_socket; // The "connection id"
|
||||
|
||||
// Demo button methods
|
||||
public void Join()
|
||||
{
|
||||
GameObject go = GameObject.Find ("inputNetworkID");
|
||||
InputField input = go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Joining: " + input.text);
|
||||
zt.JoinNetwork (input.text);
|
||||
}
|
||||
|
||||
public void Leave()
|
||||
{
|
||||
GameObject go = GameObject.Find ("inputNetworkID");
|
||||
InputField input = go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Leaving: " + input.text);
|
||||
zt.LeaveNetwork (input.text);
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
GameObject addr_go = GameObject.Find ("inputServerAddress");
|
||||
GameObject port_go = GameObject.Find ("inputServerPort");
|
||||
InputField addr = addr_go.GetComponents<InputField> () [0];
|
||||
InputField port = port_go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Connecting to: " + addr.text + ":" + port.text);
|
||||
|
||||
Thread connectThread = new Thread(() => {
|
||||
byte error = 0;
|
||||
server_connection_socket = zt.Connect (0, addr.text, int.Parse (port.text), out error);
|
||||
Debug.Log ("server_connection_socket = " + server_connection_socket);
|
||||
Debug.Log ("Connect(): " + error);
|
||||
});
|
||||
connectThread.IsBackground = true;
|
||||
connectThread.Start();
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
GameObject addr_go = GameObject.Find ("inputServerAddress");
|
||||
GameObject port_go = GameObject.Find ("inputServerAddress");
|
||||
InputField addr = addr_go.GetComponents<InputField> () [0];
|
||||
InputField port = port_go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Disconnecting from: " + addr.text + ":" + port.text);
|
||||
Debug.Log ("Disconnect(): " + zt.Disconnect (server_connection_socket));
|
||||
}
|
||||
|
||||
public void SendMessage()
|
||||
{
|
||||
//zt_test_network ();
|
||||
GameObject go = GameObject.Find ("inputMessage");
|
||||
InputField msg = go.GetComponents<InputField> () [0];
|
||||
|
||||
Thread sendThread = new Thread(() => {
|
||||
Debug.Log ("Sending Message: " + msg.text);
|
||||
byte error = 0;
|
||||
zt.Send (server_connection_socket, msg.text.ToCharArray (), msg.text.ToCharArray ().Length, out error);
|
||||
Debug.Log ("Send(): " + error);
|
||||
});
|
||||
sendThread.IsBackground = true;
|
||||
sendThread.Start();
|
||||
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
// Set defaults
|
||||
InputField input;
|
||||
GameObject go;
|
||||
go = GameObject.Find ("inputNetworkID");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "565799d8f6e1c11a";
|
||||
go = GameObject.Find ("inputServerAddress");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "172.22.211.245";
|
||||
go = GameObject.Find ("inputServerPort");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "8887";
|
||||
go = GameObject.Find ("inputMessage");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "Welcome to the machine";
|
||||
|
||||
// Create new instance of ZeroTier in separate thread
|
||||
zt = new ZeroTierNetworkInterface ("/Users/Joseph/utest2/nc_565799d8f6e1c11a");
|
||||
|
||||
/* This new instance will communicate via a named pipe, so any
|
||||
* API calls (ZeroTier.Connect(), ZeroTier.Send(), etc) will be sent to the service
|
||||
* via this pipe.
|
||||
*/
|
||||
}
|
||||
|
||||
// Terminate the ZeroTier service when the application quits
|
||||
void OnApplicationQuit() {
|
||||
Debug.Log ("OnApplicationQuit()");
|
||||
zt.Terminate ();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update () {
|
||||
/*
|
||||
if (text) {
|
||||
text.text = IsRunning() ? "ZeroTier Status: Online" : "ZeroTier Status: Offline";
|
||||
}
|
||||
*/
|
||||
|
||||
// ---
|
||||
|
||||
int recHostId;
|
||||
int connectionId;
|
||||
int channelId;
|
||||
byte[] recBuffer = new byte[1024];
|
||||
int bufferSize = 1024;
|
||||
int dataSize;
|
||||
byte error;
|
||||
NetworkEventType recData = zt.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
|
||||
switch (recData)
|
||||
{
|
||||
case NetworkEventType.Nothing: //1
|
||||
break;
|
||||
case NetworkEventType.ConnectEvent: //2
|
||||
Debug.Log("NetworkEventType.ConnectEvent");
|
||||
break;
|
||||
case NetworkEventType.DataEvent: //3
|
||||
Debug.Log("NetworkEventType.DataEvent");
|
||||
break;
|
||||
case NetworkEventType.DisconnectEvent: //4
|
||||
Debug.Log("NetworkEventType.DisconnectEvent");
|
||||
break;
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
/*
|
||||
GameObject go = GameObject.Find ("_txtStatusIndicator");
|
||||
Text text = go.GetComponents<Text> () [0];
|
||||
text.text = zt.IsRunning () ? "ZeroTier Service: ONLINE" : "ZeroTier Service: OFFLINE";
|
||||
*/
|
||||
|
||||
// Rotate ZTCube when ZT is running
|
||||
/*
|
||||
if (zt.IsRunning ()) {
|
||||
|
||||
|
||||
go = GameObject.Find ("ZTCube");
|
||||
Vector3 rotvec = new Vector3 (10f, 10f, 10f);
|
||||
go.transform.Rotate (rotvec, speed * Time.deltaTime);
|
||||
}
|
||||
GameObject go = GameObject.Find("ZTCube");
|
||||
Text text = go.GetComponents<Text> ()[0];
|
||||
*/
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,214 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
||||
*
|
||||
* If you would like to embed ZeroTier into a commercial application or
|
||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Threading;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.IO;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
// Demonstrates the usage of the ZeroTier LLAPI (modeled after the Unity LLAPI)
|
||||
public class ZeroTierLLAPI_Demo : MonoBehaviour
|
||||
{
|
||||
public float speed = 300f;
|
||||
|
||||
private ZeroTierLLAPI zt;
|
||||
string nwid = "";
|
||||
|
||||
int server_connection_socket; // The "connection id"
|
||||
int host_socket;
|
||||
|
||||
// Demo button methods
|
||||
public void Join()
|
||||
{
|
||||
GameObject go = GameObject.Find ("inputNetworkID");
|
||||
InputField input = go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Joining: " + input.text);
|
||||
zt.JoinNetwork (input.text);
|
||||
}
|
||||
|
||||
public void Leave()
|
||||
{
|
||||
GameObject go = GameObject.Find ("inputNetworkID");
|
||||
InputField input = go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Leaving: " + input.text);
|
||||
zt.LeaveNetwork (input.text);
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
GameObject addr_go = GameObject.Find ("inputServerAddress");
|
||||
GameObject port_go = GameObject.Find ("inputServerPort");
|
||||
InputField addr = addr_go.GetComponents<InputField> () [0];
|
||||
InputField port = port_go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Connecting to: " + addr.text + ":" + port.text);
|
||||
|
||||
Thread connectThread = new Thread(() => {
|
||||
byte error = 0;
|
||||
server_connection_socket = zt.Connect (0, addr.text, int.Parse (port.text), out error);
|
||||
Debug.Log ("server_connection_socket = " + server_connection_socket);
|
||||
Debug.Log ("Connect(): " + error);
|
||||
});
|
||||
connectThread.IsBackground = true;
|
||||
connectThread.Start();
|
||||
}
|
||||
|
||||
public void Bind()
|
||||
{
|
||||
GameObject addr_go = GameObject.Find ("inputServerAddress");
|
||||
GameObject port_go = GameObject.Find ("inputServerPort");
|
||||
InputField addr = addr_go.GetComponents<InputField> () [0];
|
||||
InputField port = port_go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Binding to: " + addr.text + ":" + port.text);
|
||||
|
||||
Thread connectThread = new Thread(() => {
|
||||
byte error = 0;
|
||||
host_socket = zt.AddHost (int.Parse (port.text));
|
||||
Debug.Log ("host_socket = " + host_socket);
|
||||
Debug.Log ("Bind(): " + error);
|
||||
});
|
||||
connectThread.IsBackground = true;
|
||||
connectThread.Start();
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
GameObject addr_go = GameObject.Find ("inputServerAddress");
|
||||
GameObject port_go = GameObject.Find ("inputServerAddress");
|
||||
InputField addr = addr_go.GetComponents<InputField> () [0];
|
||||
InputField port = port_go.GetComponents<InputField> () [0];
|
||||
Debug.Log ("Disconnecting from: " + addr.text + ":" + port.text);
|
||||
Debug.Log ("Disconnect(): " + zt.Disconnect (server_connection_socket));
|
||||
}
|
||||
|
||||
public void SendMessage()
|
||||
{
|
||||
//zt_test_network ();
|
||||
GameObject go = GameObject.Find ("inputMessage");
|
||||
InputField msg = go.GetComponents<InputField> () [0];
|
||||
|
||||
Thread sendThread = new Thread(() => {
|
||||
Debug.Log ("Sending Message: " + msg.text);
|
||||
byte error = 0;
|
||||
zt.Send (server_connection_socket, msg.text.ToCharArray (), msg.text.ToCharArray ().Length, out error);
|
||||
Debug.Log ("Send(): " + error);
|
||||
});
|
||||
sendThread.IsBackground = true;
|
||||
sendThread.Start();
|
||||
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
// Set defaults
|
||||
InputField input;
|
||||
GameObject go;
|
||||
go = GameObject.Find ("inputNetworkID");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "565799d8f6e1c11a";
|
||||
go = GameObject.Find ("inputServerAddress");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "172.22.211.245";
|
||||
go = GameObject.Find ("inputServerPort");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "8887";
|
||||
go = GameObject.Find ("inputMessage");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "Welcome to the machine";
|
||||
|
||||
// Create new instance of ZeroTier in separate thread
|
||||
zt = new ZeroTierLLAPI ("/Users/Joseph/utest2/nc_565799d8f6e1c11a");
|
||||
|
||||
/* This new instance will communicate via a named pipe, so any
|
||||
* API calls (ZeroTier.Connect(), ZeroTier.Send(), etc) will be sent to the service
|
||||
* via this pipe.
|
||||
*/
|
||||
}
|
||||
|
||||
// Terminate the ZeroTier service when the application quits
|
||||
void OnApplicationQuit() {
|
||||
Debug.Log ("OnApplicationQuit()");
|
||||
zt.Terminate ();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update () {
|
||||
/*
|
||||
if (text) {
|
||||
text.text = IsRunning() ? "ZeroTier Status: Online" : "ZeroTier Status: Offline";
|
||||
}
|
||||
*/
|
||||
|
||||
// ---
|
||||
|
||||
int recHostId;
|
||||
int connectionId;
|
||||
int channelId;
|
||||
byte[] recBuffer = new byte[1024];
|
||||
int bufferSize = 1024;
|
||||
int dataSize;
|
||||
byte error;
|
||||
NetworkEventType recData = zt.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
|
||||
switch (recData)
|
||||
{
|
||||
case NetworkEventType.Nothing:
|
||||
break;
|
||||
case NetworkEventType.ConnectEvent:
|
||||
Debug.Log("NetworkEventType.ConnectEvent");
|
||||
break;
|
||||
case NetworkEventType.DataEvent:
|
||||
Debug.Log("NetworkEventType.DataEvent");
|
||||
break;
|
||||
case NetworkEventType.DisconnectEvent:
|
||||
Debug.Log("NetworkEventType.DisconnectEvent");
|
||||
break;
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
/*
|
||||
GameObject go = GameObject.Find ("_txtStatusIndicator");
|
||||
Text text = go.GetComponents<Text> () [0];
|
||||
text.text = zt.IsRunning () ? "ZeroTier Service: ONLINE" : "ZeroTier Service: OFFLINE";
|
||||
*/
|
||||
|
||||
// Rotate ZTCube when ZT is running
|
||||
/*
|
||||
if (zt.IsRunning ()) {
|
||||
|
||||
|
||||
go = GameObject.Find ("ZTCube");
|
||||
Vector3 rotvec = new Vector3 (10f, 10f, 10f);
|
||||
go.transform.Rotate (rotvec, speed * Time.deltaTime);
|
||||
}
|
||||
GameObject go = GameObject.Find("ZTCube");
|
||||
Text text = go.GetComponents<Text> ()[0];
|
||||
*/
|
||||
}
|
||||
}
|
||||
@@ -1,332 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
||||
*
|
||||
* If you would like to embed ZeroTier into a commercial application or
|
||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using C5;
|
||||
|
||||
public class ZeroTierNetworkInterface {
|
||||
|
||||
// Apple
|
||||
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_OSX";
|
||||
#endif
|
||||
|
||||
#if UNITY_IOS || UNITY_IPHONE
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_iOS";
|
||||
#endif
|
||||
|
||||
// Windows
|
||||
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_WIN";
|
||||
#endif
|
||||
|
||||
// Linux
|
||||
#if UNITY_STANDALONE_LINUX
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_LINUX";
|
||||
#endif
|
||||
|
||||
// Android
|
||||
#if UNITY_ANDROID
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_ANDROID";
|
||||
#endif
|
||||
|
||||
// Interop structures
|
||||
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
|
||||
public struct sockaddr {
|
||||
/// u_short->unsigned short
|
||||
public ushort sa_family;
|
||||
/// char[14]
|
||||
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=14)]
|
||||
public string sa_data;
|
||||
}
|
||||
|
||||
// ZeroTier background thread
|
||||
private Thread ztThread;
|
||||
|
||||
private ArrayList<int> connections = new ArrayList<int> ();
|
||||
|
||||
// Virtual network interace config
|
||||
private int MaxPacketSize;
|
||||
private string rpc_path = "/does/this/work";
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||
public delegate void MyDelegate(string str);
|
||||
|
||||
static void CallBackFunction(string str) {
|
||||
Debug.Log("Native ZT Plugin: " + str);
|
||||
}
|
||||
|
||||
#region
|
||||
// ZeroTier service / debug initialization
|
||||
[DllImport (DLL_PATH)]
|
||||
public static extern void SetDebugFunction( IntPtr fp );
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int unity_start_service(string path);
|
||||
|
||||
// Connection calls
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int zt_socket(int family, int type, int protocol);
|
||||
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe private static extern int zt_bind(int sockfd, System.IntPtr addr, int addrlen);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe private static extern int zt_connect(int sockfd, System.IntPtr addr, int addrlen);
|
||||
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int zt_accept(int sockfd);
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int zt_listen(int sockfd, int backlog);
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int zt_close(int sockfd);
|
||||
|
||||
// RX / TX
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe private static extern int zt_recv(int sockfd, string buf, int len);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe private static extern int zt_send(int sockfd, IntPtr buf, int len);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe private static extern int zt_set_nonblock(int sockfd);
|
||||
|
||||
// ZT Thread controls
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern bool zt_is_running();
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern void zt_terminate();
|
||||
|
||||
// ZT Network controls
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern bool zt_join_network(string nwid);
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern void zt_leave_network(string nwid);
|
||||
#endregion
|
||||
|
||||
// Thread which starts the ZeroTier service
|
||||
// The ZeroTier service may spin off a SOCKS5 proxy server
|
||||
// if -DUSE_SOCKS_PROXY is set when building the bundle
|
||||
private void zt_service_thread()
|
||||
{
|
||||
MyDelegate callback_delegate = new MyDelegate( CallBackFunction );
|
||||
// Convert callback_delegate into a function pointer that can be
|
||||
// used in unmanaged code.
|
||||
IntPtr intptr_delegate =
|
||||
Marshal.GetFunctionPointerForDelegate(callback_delegate);
|
||||
// Call the API passing along the function pointer.
|
||||
SetDebugFunction( intptr_delegate );
|
||||
Debug.Log ("rpc_path = " + rpc_path);
|
||||
unity_start_service (rpc_path);
|
||||
}
|
||||
|
||||
// Start the ZeroTier service
|
||||
private void Init()
|
||||
{
|
||||
// TODO: Handle exceptions from unmanaged code
|
||||
ztThread = new Thread(() => {
|
||||
try {
|
||||
zt_service_thread();
|
||||
} catch(Exception e) {
|
||||
Debug.Log(e.Message.ToString());
|
||||
}
|
||||
});
|
||||
ztThread.IsBackground = true; // Allow the thread to be aborted safely
|
||||
ztThread.Start();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service with a given path
|
||||
public ZeroTierNetworkInterface(string path)
|
||||
{
|
||||
rpc_path = path;
|
||||
Init();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service
|
||||
public ZeroTierNetworkInterface()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service
|
||||
// Use the GlobalConfig to set things like the max packet size
|
||||
public ZeroTierNetworkInterface(GlobalConfig gConfig)
|
||||
{
|
||||
MaxPacketSize = gConfig.MaxPacketSize; // TODO: Do something with this!
|
||||
Init();
|
||||
}
|
||||
|
||||
// Joins a ZeroTier virtual network
|
||||
public void JoinNetwork(string nwid)
|
||||
{
|
||||
zt_join_network(nwid);
|
||||
}
|
||||
|
||||
// Leaves a ZeroTier virtual network
|
||||
public void LeaveNetwork(string nwid)
|
||||
{
|
||||
zt_leave_network(nwid);
|
||||
}
|
||||
|
||||
// Creates a ZeroTier Socket and binds on the port provided
|
||||
// A client instance can now connect to this "host"
|
||||
public int AddHost(int port)
|
||||
{
|
||||
int sockfd = zt_socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
if (sockfd < 0) {
|
||||
return -1;
|
||||
}
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr("0.0.0.0" + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
|
||||
// Set socket to non-blocking for RX polling in Receive()
|
||||
zt_set_nonblock(sockfd);
|
||||
|
||||
return zt_bind (sockfd, pSockAddr, addrlen);
|
||||
}
|
||||
|
||||
// hostId - host socket ID for this connection
|
||||
public int Connect(int hostId, string address, int port, out byte error)
|
||||
{
|
||||
int sockfd = zt_socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
Debug.Log ("sockfd = " + sockfd);
|
||||
|
||||
if (sockfd < 0) {
|
||||
error = (byte)sockfd;
|
||||
return -1;
|
||||
}
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(address + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
error = (byte)zt_connect (sockfd, pSockAddr, addrlen);
|
||||
|
||||
// Set socket to non-blocking for RX polling in Receive()
|
||||
zt_set_nonblock(sockfd);
|
||||
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
// Returns whether the ZeroTier service is currently running
|
||||
public bool IsRunning()
|
||||
{
|
||||
return zt_is_running ();
|
||||
}
|
||||
|
||||
// Terminates the ZeroTier service
|
||||
public void Terminate()
|
||||
{
|
||||
zt_terminate ();
|
||||
}
|
||||
|
||||
// Shutdown a given connection
|
||||
public int Disconnect(int fd)
|
||||
{
|
||||
return zt_close (fd);
|
||||
}
|
||||
|
||||
// Write data to a ZeroTier socket
|
||||
/*
|
||||
public int Send(int fd, char[] buf, int len, out byte error)
|
||||
{
|
||||
GCHandle buf_handle = GCHandle.Alloc (buf, GCHandleType.Pinned);
|
||||
IntPtr pBufPtr = buf_handle.AddrOfPinnedObject ();
|
||||
|
||||
error = 0;
|
||||
int bytes_written;
|
||||
string str = new string (buf);
|
||||
if((bytes_written = zt_send (fd, str, len)) < 0) {
|
||||
error = (byte)bytes_written;
|
||||
}
|
||||
return bytes_written;
|
||||
}
|
||||
*/
|
||||
|
||||
// Write data to a ZeroTier socket
|
||||
public int Send(int fd, char[] buf, int len, out byte error)
|
||||
{
|
||||
GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
||||
IntPtr ptr = handle.AddrOfPinnedObject();
|
||||
error = 0;
|
||||
int bytes_written;
|
||||
// FIXME: Sending a length of 2X the buffer size seems to fix the object pinning issue
|
||||
if((bytes_written = zt_send(fd, ptr, len*2)) < 0) {
|
||||
error = (byte)bytes_written;
|
||||
}
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
// Checks for data to RX
|
||||
/*
|
||||
public enum NetworkEventType
|
||||
{
|
||||
DataEvent,
|
||||
ConnectEvent,
|
||||
DisconnectEvent,
|
||||
Nothing,
|
||||
BroadcastEvent
|
||||
}
|
||||
*/
|
||||
public NetworkEventType Receive(out int hostId, out int connectionId, out int channelId, byte[] buffer, int bufferSize, out int receivedSize, out byte error)
|
||||
{
|
||||
/*
|
||||
* If recBuffer is big enough to contain data, data will be copied in the buffer.
|
||||
* If not, error will contain MessageToLong error and you will need reallocate
|
||||
* buffer and call this function again. */
|
||||
|
||||
|
||||
|
||||
for (int i = 0; i < connections.Count; i++) {
|
||||
|
||||
}
|
||||
|
||||
int res;
|
||||
res = zt_recv (connectionId, buffer, bufferSize);
|
||||
|
||||
// FIXME: Not quite semantically the same, but close enough for alpha release?
|
||||
// FIXME: Get notifications of disconnect events?
|
||||
if (res == -1) {
|
||||
error = -1;
|
||||
return NetworkEventType.DisconnectEvent;
|
||||
}
|
||||
if(res == 0) {
|
||||
error = 0;
|
||||
return NetworkEventType.Nothing; // No data read
|
||||
}
|
||||
if (res > 0) {
|
||||
receivedSize = res;
|
||||
Marshal.Copy(buffer, buffer, 0, res);
|
||||
return NetworkEventType.DataEvent; // Data read into buffer
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,175 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
||||
*
|
||||
* If you would like to embed ZeroTier into a commercial application or
|
||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Threading;
|
||||
using System.Net.Sockets;
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
// Provides a familiar interface which is modeled after the Unity LLAPI
|
||||
public class ZeroTierLLAPI : ZeroTierNetworkInterface {
|
||||
|
||||
// Initialize the ZeroTier service with a given path
|
||||
public ZeroTierLLAPI(string path)
|
||||
{
|
||||
rpc_path = path;
|
||||
Init();
|
||||
}
|
||||
|
||||
// Creates a ZeroTier Socket and binds on the port provided
|
||||
// A client instance can now connect to this "host"
|
||||
public int AddHost(int port)
|
||||
{
|
||||
int sockfd = zt_socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
if (sockfd < 0) {
|
||||
return -1;
|
||||
}
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr("0.0.0.0" + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
// Set socket to non-blocking for RX polling in Receive()
|
||||
zt_set_nonblock(sockfd);
|
||||
return zt_bind (sockfd, pSockAddr, addrlen);
|
||||
}
|
||||
|
||||
// hostId - host socket ID for this connection
|
||||
public int Connect(int hostId, string address, int port, out byte error)
|
||||
{
|
||||
int sockfd = zt_socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
Debug.Log ("sockfd = " + sockfd);
|
||||
|
||||
if (sockfd < 0) {
|
||||
error = (byte)sockfd;
|
||||
return -1;
|
||||
}
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(address + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
error = (byte)zt_connect (sockfd, pSockAddr, addrlen);
|
||||
|
||||
// Set socket to non-blocking for RX polling in Receive()
|
||||
zt_set_nonblock(sockfd);
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
// Write data to a ZeroTier socket
|
||||
public int Send(int fd, char[] buf, int len, out byte error)
|
||||
{
|
||||
error = 0;
|
||||
return Write(fd, buf, len);
|
||||
}
|
||||
|
||||
// Checks for data to RX
|
||||
/*
|
||||
public enum NetworkEventType
|
||||
{
|
||||
DataEvent,
|
||||
ConnectEvent,
|
||||
DisconnectEvent,
|
||||
Nothing,
|
||||
BroadcastEvent
|
||||
}
|
||||
*/
|
||||
public NetworkEventType Receive(out int hostId, out int connectionId, out int channelId, byte[] buffer, int bufferSize, out int receivedSize, out byte error)
|
||||
{
|
||||
hostId = 0;
|
||||
connectionId = 0;
|
||||
channelId = 0;
|
||||
receivedSize = 0;
|
||||
error = 0;
|
||||
|
||||
|
||||
// Read() ...
|
||||
|
||||
/*
|
||||
* If recBuffer is big enough to contain data, data will be copied in the buffer.
|
||||
* If not, error will contain MessageToLong error and you will need reallocate
|
||||
* buffer and call this function again. */
|
||||
|
||||
//for (int i = 0; i < connections.Count; i++) {
|
||||
|
||||
//}
|
||||
|
||||
/*
|
||||
int res;
|
||||
res = zt_recv (connectionId, buffer, bufferSize);
|
||||
|
||||
// FIXME: Not quite semantically the same, but close enough for alpha release?
|
||||
// FIXME: Get notifications of disconnect events?
|
||||
if (res == -1) {
|
||||
error = -1;
|
||||
return NetworkEventType.DisconnectEvent;
|
||||
}
|
||||
if(res == 0) {
|
||||
error = 0;
|
||||
return NetworkEventType.Nothing; // No data read
|
||||
}
|
||||
if (res > 0) {
|
||||
receivedSize = res;
|
||||
Marshal.Copy(buffer, buffer, 0, res);
|
||||
return NetworkEventType.DataEvent; // Data read into buffer
|
||||
}
|
||||
*/
|
||||
|
||||
return NetworkEventType.Nothing;
|
||||
}
|
||||
|
||||
// Shutdown a given connection
|
||||
public int Disconnect(int fd)
|
||||
{
|
||||
return zt_close (fd);
|
||||
}
|
||||
|
||||
// Test serialization methods, should be removed for production
|
||||
|
||||
public static byte[] RawSerializeEx( object anything )
|
||||
{
|
||||
int rawsize = Marshal.SizeOf( anything );
|
||||
byte[] rawdatas = new byte[ rawsize ];
|
||||
GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned );
|
||||
IntPtr buffer = handle.AddrOfPinnedObject();
|
||||
Marshal.StructureToPtr( anything, buffer, false );
|
||||
handle.Free();
|
||||
return rawdatas;
|
||||
}
|
||||
|
||||
|
||||
public static object RawDeserializeEx( byte[] rawdatas, Type anytype )
|
||||
{
|
||||
int rawsize = Marshal.SizeOf( anytype );
|
||||
if( rawsize > rawdatas.Length )
|
||||
return null;
|
||||
GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned );
|
||||
IntPtr buffer = handle.AddrOfPinnedObject();
|
||||
object retobj = Marshal.PtrToStructure( buffer, anytype );
|
||||
handle.Free();
|
||||
return retobj;
|
||||
}
|
||||
}
|
||||
@@ -59,6 +59,7 @@ public class ZeroTierNetworkInterface {
|
||||
// Only allow one network at a time for BETA
|
||||
protected bool joined_to_network = false;
|
||||
protected string nwid = "";
|
||||
protected string path = "";
|
||||
|
||||
// Platform-specific paths and bundle/libary names
|
||||
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
||||
@@ -88,6 +89,8 @@ public class ZeroTierNetworkInterface {
|
||||
public static extern void SetDebugFunction( IntPtr fp );
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int unity_start_service(string path);
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int unity_start_service_and_rpc(string path, string nwid);
|
||||
|
||||
// Connection calls
|
||||
[DllImport (DLL_PATH)]
|
||||
@@ -153,8 +156,8 @@ public class ZeroTierNetworkInterface {
|
||||
// Returns a path for RPC communications to the service
|
||||
private string rpcCommPath()
|
||||
{
|
||||
if(rpc_path != "" && nwid != "") {
|
||||
return rpc_path + "nc_" + nwid;
|
||||
if(path != "" && nwid != "") {
|
||||
return path + "nc_" + nwid;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -166,13 +169,18 @@ public class ZeroTierNetworkInterface {
|
||||
MyDelegate callback_delegate = new MyDelegate( CallBackFunction );
|
||||
IntPtr intptr_delegate = Marshal.GetFunctionPointerForDelegate(callback_delegate);
|
||||
SetDebugFunction( intptr_delegate );
|
||||
Debug.Log ("RPC = " + rpcCommPath());
|
||||
|
||||
// Start service
|
||||
unity_start_service(rpcCommPath());
|
||||
/* This new instance will communicate via a named pipe, so any
|
||||
* API calls (ZeroTier.Connect(), ZeroTier.Send(), etc) will be sent to the service
|
||||
* via this pipe.
|
||||
*/
|
||||
if(nwid.Length > 0) {
|
||||
unity_start_service_and_rpc (path, nwid);
|
||||
}
|
||||
else {
|
||||
unity_start_service(rpcCommPath());
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the nwid of the network you're currently connected to
|
||||
@@ -200,12 +208,19 @@ public class ZeroTierNetworkInterface {
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service with a given path
|
||||
public ZeroTierNetworkInterface(string nwid)
|
||||
public ZeroTierNetworkInterface(string path, string nwid)
|
||||
{
|
||||
this.path = path;
|
||||
this.nwid = nwid;
|
||||
Init();
|
||||
}
|
||||
|
||||
public ZeroTierNetworkInterface (string path)
|
||||
{
|
||||
this.path = path;
|
||||
Init();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service
|
||||
public ZeroTierNetworkInterface()
|
||||
{
|
||||
|
||||
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
||||
*
|
||||
* If you would like to embed ZeroTier into a commercial application or
|
||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
|
||||
// Provides a bare-bones interface to ZeroTier-administered sockets
|
||||
public class ZeroTierNetworkInterface {
|
||||
|
||||
// Apple
|
||||
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_OSX";
|
||||
#endif
|
||||
|
||||
#if UNITY_IOS || UNITY_IPHONE
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_iOS";
|
||||
#endif
|
||||
|
||||
// Windows
|
||||
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_WIN";
|
||||
#endif
|
||||
|
||||
// Linux
|
||||
#if UNITY_STANDALONE_LINUX
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_LINUX";
|
||||
#endif
|
||||
|
||||
// Android
|
||||
#if UNITY_ANDROID
|
||||
const string DLL_PATH = "ZeroTierSDK_Unity3D_ANDROID";
|
||||
#endif
|
||||
|
||||
// Interop structures
|
||||
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
|
||||
public struct sockaddr {
|
||||
/// u_short->unsigned short
|
||||
public ushort sa_family;
|
||||
/// char[14]
|
||||
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=14)]
|
||||
public string sa_data;
|
||||
}
|
||||
|
||||
// ZeroTier background thread
|
||||
protected Thread ztThread;
|
||||
protected List<int> connections = new List<int> ();
|
||||
protected int MaxPacketSize;
|
||||
protected string rpc_path = "";
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||
public delegate void MyDelegate(string str);
|
||||
|
||||
static void CallBackFunction(string str) {
|
||||
Debug.Log("Native ZT Plugin: " + str);
|
||||
}
|
||||
|
||||
#region DLL Imports
|
||||
// ZeroTier service / debug initialization
|
||||
[DllImport (DLL_PATH)]
|
||||
public static extern void SetDebugFunction( IntPtr fp );
|
||||
[DllImport (DLL_PATH)]
|
||||
private static extern int unity_start_service(string path);
|
||||
|
||||
// Connection calls
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern int zt_socket(int family, int type, int protocol);
|
||||
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe protected static extern int zt_bind(int sockfd, System.IntPtr addr, int addrlen);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe protected static extern int zt_connect(int sockfd, System.IntPtr addr, int addrlen);
|
||||
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern int zt_accept(int sockfd);
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern int zt_listen(int sockfd, int backlog);
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern int zt_close(int sockfd);
|
||||
|
||||
// RX / TX
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe protected static extern int zt_recv(int sockfd, [In, Out] IntPtr buf, int len);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe protected static extern int zt_send(int sockfd, IntPtr buf, int len);
|
||||
[DllImport (DLL_PATH)]
|
||||
unsafe protected static extern int zt_set_nonblock(int sockfd);
|
||||
|
||||
// ZT Thread controls
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern bool zt_is_running();
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern void zt_terminate();
|
||||
|
||||
// ZT Network controls
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern bool zt_join_network(string nwid);
|
||||
[DllImport (DLL_PATH)]
|
||||
protected static extern void zt_leave_network(string nwid);
|
||||
#endregion
|
||||
|
||||
// Thread which starts the ZeroTier service
|
||||
// The ZeroTier service may spin off a SOCKS5 proxy server
|
||||
// if -DUSE_SOCKS_PROXY is set when building the bundle
|
||||
protected void zt_service_thread()
|
||||
{
|
||||
MyDelegate callback_delegate = new MyDelegate( CallBackFunction );
|
||||
// Convert callback_delegate into a function pointer that can be
|
||||
// used in unmanaged code.
|
||||
IntPtr intptr_delegate =
|
||||
Marshal.GetFunctionPointerForDelegate(callback_delegate);
|
||||
// Call the API passing along the function pointer.
|
||||
SetDebugFunction( intptr_delegate );
|
||||
Debug.Log ("rpc_path = " + rpc_path);
|
||||
unity_start_service (rpc_path);
|
||||
}
|
||||
|
||||
// Start the ZeroTier service
|
||||
protected void Init()
|
||||
{
|
||||
// TODO: Handle exceptions from unmanaged code
|
||||
ztThread = new Thread(() => {
|
||||
try {
|
||||
zt_service_thread();
|
||||
} catch(Exception e) {
|
||||
Debug.Log(e.Message.ToString());
|
||||
}
|
||||
});
|
||||
ztThread.IsBackground = true; // Allow the thread to be aborted safely
|
||||
ztThread.Start();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service with a given path
|
||||
public ZeroTierNetworkInterface(string path)
|
||||
{
|
||||
rpc_path = path;
|
||||
Init();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service
|
||||
public ZeroTierNetworkInterface()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
// Initialize the ZeroTier service
|
||||
// Use the GlobalConfig to set things like the max packet size
|
||||
public ZeroTierNetworkInterface(GlobalConfig gConfig)
|
||||
{
|
||||
MaxPacketSize = gConfig.MaxPacketSize; // TODO: Do something with this!
|
||||
Init();
|
||||
}
|
||||
|
||||
#region Network Handling
|
||||
// Joins a ZeroTier virtual network
|
||||
public void JoinNetwork(string nwid)
|
||||
{
|
||||
zt_join_network(nwid);
|
||||
}
|
||||
|
||||
// Leaves a ZeroTier virtual network
|
||||
public void LeaveNetwork(string nwid)
|
||||
{
|
||||
zt_leave_network(nwid);
|
||||
}
|
||||
#endregion
|
||||
|
||||
// Low-level representations of ZeroTier sockets
|
||||
// The ZeroTier LLAPI is built on top of these
|
||||
|
||||
// Creates a new ZeroTier-administered socket
|
||||
public int Socket(int family, int type, int protocol)
|
||||
{
|
||||
return zt_socket (family, type, protocol);
|
||||
}
|
||||
|
||||
// Binds to a specific address
|
||||
public int Bind(int fd, string addr, int port)
|
||||
{
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(addr + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
return zt_bind (fd, pSockAddr, addrlen);
|
||||
}
|
||||
|
||||
// Listens for an incoming connection request
|
||||
public int Listen(int fd, int backlog)
|
||||
{
|
||||
return zt_listen(fd, backlog);
|
||||
}
|
||||
|
||||
// Accepts an incoming connection
|
||||
public int Accept(int fd)
|
||||
{
|
||||
return zt_accept (fd);
|
||||
}
|
||||
|
||||
// Closes a connection
|
||||
public int Close(int fd)
|
||||
{
|
||||
return Close (fd);
|
||||
}
|
||||
|
||||
// Connects to a remote host
|
||||
public int Connect(int fd, string addr, int port)
|
||||
{
|
||||
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(addr + ":" + port);
|
||||
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||
return zt_connect (fd, pSockAddr, addrlen);
|
||||
}
|
||||
|
||||
public int Read(int fd, ref char[] buf, int len)
|
||||
{
|
||||
GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
||||
IntPtr ptr = handle.AddrOfPinnedObject();
|
||||
int bytes_read = zt_recv (fd, ptr, len*2);
|
||||
string str = Marshal.PtrToStringAuto(ptr);
|
||||
//Marshal.Copy (ptr, buf, 0, bytes_read);
|
||||
buf = Marshal.PtrToStringAnsi(ptr).ToCharArray();
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
public int Write(int fd, char[] buf, int len)
|
||||
{
|
||||
GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
||||
IntPtr ptr = handle.AddrOfPinnedObject();
|
||||
//error = 0;
|
||||
int bytes_written;
|
||||
// FIXME: Sending a length of 2X the buffer size seems to fix the object pinning issue
|
||||
if((bytes_written = zt_send(fd, ptr, len*2)) < 0) {
|
||||
//error = (byte)bytes_written;
|
||||
}
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
#region Service-Related calls
|
||||
// Returns whether the ZeroTier service is currently running
|
||||
public bool IsRunning()
|
||||
{
|
||||
return zt_is_running ();
|
||||
}
|
||||
|
||||
// Terminates the ZeroTier service
|
||||
public void Terminate()
|
||||
{
|
||||
zt_terminate ();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -77,7 +77,6 @@ public class ZeroTierSockets_Demo : MonoBehaviour
|
||||
Debug.Log ("Connecting to: " + addr.text + ":" + port.text);
|
||||
|
||||
Thread connectThread = new Thread(() => {
|
||||
|
||||
int sockfd = zt.Socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
Debug.Log ("sockfd = " + sockfd);
|
||||
int port_num;
|
||||
@@ -223,19 +222,19 @@ public class ZeroTierSockets_Demo : MonoBehaviour
|
||||
GameObject go;
|
||||
go = GameObject.Find ("inputNetworkID");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "565799d8f6e1c11a";
|
||||
input.text = "565799d8f65063e5";
|
||||
go = GameObject.Find ("inputServerAddress");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "172.22.211.245";
|
||||
input.text = "10.9.9.203";
|
||||
go = GameObject.Find ("inputServerPort");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "5555";
|
||||
input.text = "8080";
|
||||
go = GameObject.Find ("inputMessage");
|
||||
input = go.GetComponents<InputField> () [0];
|
||||
input.text = "Welcome to the machine";
|
||||
|
||||
// Create new instance of ZeroTier in separate thread
|
||||
zt = new ZeroTierNetworkInterface ();
|
||||
zt = new ZeroTierNetworkInterface ("/Users/Joseph/utest3", "565799d8f65063e5");
|
||||
}
|
||||
|
||||
// Terminate the ZeroTier service when the application quits
|
||||
|
||||
29
integrations/Unity3D/Unity3D.sln
Normal file
29
integrations/Unity3D/Unity3D.sln
Normal file
@@ -0,0 +1,29 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2008
|
||||
|
||||
Project("{0BF2C6BC-4121-AE75-A3F9-F3A441421429}") = "Unity3D", "Assembly-CSharp.csproj", "{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}"
|
||||
EndProject
|
||||
Project("{0BF2C6BC-4121-AE75-A3F9-F3A441421429}") = "Unity3D", "Assembly-CSharp-Editor.csproj", "{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(MonoDevelopProperties) = preSolution
|
||||
StartupItem = Assembly-CSharp.csproj
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
17
integrations/Unity3D/Unity3D.userprefs
Normal file
17
integrations/Unity3D/Unity3D.userprefs
Normal file
@@ -0,0 +1,17 @@
|
||||
<Properties StartupItem="Assembly-CSharp.csproj">
|
||||
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" PreferredExecutionTarget="Unity.Instance.Unity Editor" />
|
||||
<MonoDevelop.Ide.Workbench ActiveDocument="Assets/ZeroTierNetworkInterface.cs">
|
||||
<Files>
|
||||
<File FileName="Assets/ZeroTierNetworkInterface.cs" Line="52" Column="1" />
|
||||
<File FileName="Assets/ZeroTierSockets_Demo.cs" Line="213" Column="51" />
|
||||
<File FileName="Assets/Demo.cs" Line="1" Column="1" />
|
||||
<File FileName="Assets/MyZeroTier.cs" Line="1" Column="1" />
|
||||
<File FileName="Assets/WorldMain.cs" Line="1" Column="1" />
|
||||
<File FileName="Assets/ZeroTier.cs" Line="1" Column="1" />
|
||||
</Files>
|
||||
</MonoDevelop.Ide.Workbench>
|
||||
<MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<BreakpointStore />
|
||||
</MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
|
||||
</Properties>
|
||||
@@ -1379,6 +1379,7 @@
|
||||
"-D__UNITY_3D__",
|
||||
"-DSDK",
|
||||
"-DSDK_DEBUG",
|
||||
"-DUSE_SOCKS_PROXY",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-iOS";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -1403,6 +1404,7 @@
|
||||
OTHER_CFLAGS = (
|
||||
"-D__UNITY_3D__",
|
||||
"-DSDK",
|
||||
"-DUSE_SOCKS_PROXY",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-iOS";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -1560,6 +1562,8 @@
|
||||
"-DSDK_DEBUG",
|
||||
"-DSDK",
|
||||
"-D__UNITY_3D__",
|
||||
"-DUSE_SOCKS_PROXY",
|
||||
"-DSDK_BUNDLED",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-OSX";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -1582,7 +1586,9 @@
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = (
|
||||
"-DSDK",
|
||||
"-DUSE_SOCKS_PROXY",
|
||||
"-D__UNITY_3D__",
|
||||
"-DSDK_BUNDLED",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-OSX";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
||||
@@ -148,6 +148,7 @@ tests: $(TEST_OBJDIR) $(TEST_TARGETS)
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILD)/*
|
||||
-rm -rf $(INT)/Unity3D/Assets/Plugins/*
|
||||
-rm -rf zerotier-cli zerotier-idtool
|
||||
-find . -type f \( -name 'zerotier-one' -o -name 'zerotier-sdk-service' \) -delete
|
||||
-find . -type f \( -name '*.o' -o -name '*.so' -o -name '*.o.d' -o -name '*.out' -o -name '*.log' \) -delete
|
||||
|
||||
@@ -78,6 +78,9 @@ ios_app_framework:
|
||||
osx_unity3d_bundle:
|
||||
cd $(INT)/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_OSX build SYMROOT="../../../$(BUILD)/osx_unity3d_bundle"
|
||||
cp docs/osx_unity3d_zt_sdk.md $(BUILD)/osx_unity3d_bundle/README.md
|
||||
chmod 755 $(BUILD)/osx_unity3d_bundle/Debug/ZeroTierSDK_Unity3D_OSX.bundle
|
||||
cp -p -R $(BUILD)/osx_unity3d_bundle/Debug/ZeroTierSDK_Unity3D_OSX.bundle $(INT)/Unity3D/Assets/Plugins
|
||||
|
||||
ios_unity3d_bundle:
|
||||
cd $(INT)/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_iOS build SYMROOT="../../../$(BUILD)/ios_unity3d_bundle"
|
||||
cp docs/ios_unity3d_zt_sdk.md $(BUILD)/ios_unity3d_bundle/README.md
|
||||
@@ -147,6 +150,7 @@ JAVAC := $(shell which javac)
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILD)/*
|
||||
-rm -rf $(INT)/Unity3D/Assets/Plugins/*
|
||||
-rm -rf zerotier-cli zerotier-idtool
|
||||
-find . -type f \( -name 'zerotier-one' -o -name 'zerotier-sdk-service' \) -delete
|
||||
-find . -type f \( -name '*.o' -o -name '*.so' -o -name '*.o.d' -o -name '*.out' -o -name '*.log' \) -delete
|
||||
|
||||
@@ -98,20 +98,20 @@ void dwr(int level, const char *fmt, ... )
|
||||
#elif defined(__APPLE__)
|
||||
pid_t tid = pthread_mach_thread_np(pthread_self());
|
||||
#endif
|
||||
#if defined(SDK_DEBUG_LOG_TO_FILE)
|
||||
if(!debug_logfile) { // Try to get logfile from env
|
||||
debug_logfile = getenv("ZT_SDK_LOGFILE");
|
||||
}
|
||||
/*
|
||||
if(debug_logfile) {
|
||||
FILE *file = fopen(debug_logfile,"a");
|
||||
//#if defined(SDK_DEBUG_LOG_TO_FILE)
|
||||
//if(!debug_logfile) { // Try to get logfile from env
|
||||
// debug_logfile = getenv("ZT_SDK_LOGFILE");
|
||||
//}
|
||||
|
||||
//if(debug_logfile) {
|
||||
FILE *file = fopen("/Users/Joseph/code/unity.log","a");
|
||||
fprintf(file, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(file, fmt, ap);
|
||||
fclose(file);
|
||||
va_end(ap);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
//}
|
||||
|
||||
//#endif
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
|
||||
@@ -74,15 +74,22 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
// .NET Interop-friendly debug mechanism
|
||||
typedef void (*FuncPtr)( const char * );
|
||||
FuncPtr Debug;
|
||||
|
||||
void SetDebugFunction( FuncPtr fp ) { Debug = fp; }
|
||||
|
||||
// Starts a service at the specified path
|
||||
// Starts a ZeroTier service at the given path
|
||||
void unity_start_service(char * path, int len) {
|
||||
Debug(path);
|
||||
zt_init_rpc(path,"");
|
||||
std::string dstr = std::string(path);
|
||||
dstr = "unity_start_service(): path = " + dstr;
|
||||
Debug(dstr.c_str());
|
||||
init_service(INTERCEPT_DISABLED, path);
|
||||
}
|
||||
// Starts a ZeroTier service and RPC
|
||||
void unity_start_service_and_rpc(char * path, char *nwid, int len) {
|
||||
std::string dstr = std::string(path);
|
||||
dstr = "unity_start_service_and_rpc(): path = " + dstr;
|
||||
Debug(dstr.c_str());
|
||||
init_service_and_rpc(INTERCEPT_DISABLED, path, nwid);
|
||||
}
|
||||
#endif
|
||||
|
||||
void join_network(const char * nwid)
|
||||
@@ -100,13 +107,13 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
}
|
||||
|
||||
void leave_network(const char *nwid) { zt1Service->leave(nwid); }
|
||||
|
||||
void zt_join_network(const char * nwid) { join_network(nwid); }
|
||||
void zt_leave_network(const char * nwid) { leave_network(nwid); }
|
||||
bool zt_is_running() { return zt1Service->isRunning(); }
|
||||
void zt_terminate() { zt1Service->terminate(); }
|
||||
|
||||
|
||||
// Android JNI wrapper
|
||||
#if defined(__ANDROID__)
|
||||
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_joinNetwork(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
@@ -136,12 +143,10 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
if(zt1Service)
|
||||
zt1Service->terminate();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
// Typically used on iOS/OSX
|
||||
#if !defined(__ANDROID__)
|
||||
/*
|
||||
* Starts a service thread and performs basic setup tasks
|
||||
@@ -153,13 +158,11 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
*intercept_thread_id = key;
|
||||
pthread_create(&intercept_thread, NULL, startOneService, (void *)(intercept_thread_id));
|
||||
}
|
||||
|
||||
void init_service_and_rpc(int key, const char * path, const char * nwid) {
|
||||
rpcEnabled = true;
|
||||
rpcNWID = nwid;
|
||||
init_service(key, path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enables or disables intercept for current thread using key in thread-local storage
|
||||
*/
|
||||
@@ -172,9 +175,6 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Starts a new service instance
|
||||
*/
|
||||
@@ -193,21 +193,12 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
set_intercept_status(INTERCEPT_DISABLED);
|
||||
#endif
|
||||
|
||||
// If no homeDir is provided, attempt a best guess of an appropriate ZeroTier
|
||||
// homeDir according to platform and build type
|
||||
if(!homeDir.length())
|
||||
{
|
||||
#if defined(__UNITY_3D__) && !defined(__ANDROID__) && !defined(__IOS__)
|
||||
// Unity3D on a non-mobile platform
|
||||
homeDir = current_dir; // homeDir shall be current dir
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(__UNITY_3D__)
|
||||
int MAX_DIR_SZ = 256;
|
||||
char current_dir[MAX_DIR_SZ];
|
||||
getcwd(current_dir, MAX_DIR_SZ);
|
||||
chdir(service_path.c_str());
|
||||
homeDir = current_dir; // homeDir shall be current dir
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
@@ -276,7 +267,7 @@ void zt_init_rpc(const char * path, const char * nwid);
|
||||
#endif
|
||||
|
||||
//chdir(current_dir); // Return to previous current working directory (at the request of Unity3D)
|
||||
//Debug(homeDir.c_str());
|
||||
Debug("Starting service...\n");
|
||||
|
||||
// Initialize RPC
|
||||
if(rpcEnabled) {
|
||||
|
||||
@@ -42,7 +42,6 @@ extern "C" {
|
||||
#define INTERCEPT_ENABLED 111
|
||||
#define INTERCEPT_DISABLED 222
|
||||
|
||||
|
||||
extern std::string homeDir;
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
|
||||
@@ -119,6 +119,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
dwr(MSG_DEBUG, "zt_init_rpc(): api_netpath = %s\n", api_netpath);
|
||||
}
|
||||
|
||||
void get_api_netpath() { zt_init_rpc("",""); }
|
||||
|
||||
Reference in New Issue
Block a user