This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
zhangyang-libzt/docs/zt_llapi_unity.md
2016-06-20 16:39:41 -07:00

2.7 KiB

ZeroTier Unity LLAPI

We've tried to replicate the behavior of the Unity3D LLAPI to make using ZeroTier as easy as possible. All you need to do is add the ZeroTierSDK_Unity3D_YOUR-PLATFORM library to the assets/plugins folder of your project and start using the ZeroTierNetworkInterface:

To start things off, go check out ZeroTierSockets_Demo.cs. Here are some examples of how to use the ZeroTierNetworkInterface:

Using ZeroTier Sockets API

Server example

Thread connectThread = new Thread(() => { 
	// Create ZeroTier-administered socket
	int sock = zt.Socket ((int)AddressFamily.InterNetwork, 
						(int)SocketType.Stream, 
						(int)ProtocolType.Unspecified);
	// Bind()
	zt.Bind(sock, "0.0.0.0", 8000);

	// Listen()
	zt.Listen(sock, 1);

	// Accept() loop
	int accept_sock = -1;
	while(accept_res < 0)
	{
		accept_sock = zt.Accept(sock);
	}

	char[] msg = new char[1024];
	int bytes_read = 0;
	while(bytes_read >= 0)
	{
		bytes_read = zt.Read(accept_sock, ref msg, 80);

		string msgstr = new string(msg);
		Debug.Log("MSG (" + bytes_read + "):" + msgstr);
	}
});
connectThread.IsBackground = true;
connectThread.Start();

Client example

Thread connectThread = new Thread(() => {	
	// Create ZeroTier-administered socket		
	int sock = zt.Socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
	zt.Connect (sock, "0.0.0.0",8000);
	zt.Write(sock, "Welcome to the machine!", 24);
});
connectThread.IsBackground = true;
connectThread.Start();

Using the ZeroTier Low-level API (LLAPI)

Creating a host and receiving data

public class MyObject
{
	private ZeroTierNetworkInterface zt;

	void Start()
	{
		zt = new ZeroTierNetworkInterface("/Users/Bob/UnityGame/nc_8c493f5bef1747a6");
		zt.AddHost(8888);
	}

	void Update()
	{
		int hostId;
		int connectionId;
		int channelId;
		byte[] buffer;
		int bufferSize;
		int receivedSize;
		byte error;
		
		NetworkEventType ne = zt.Receive(out hostId, out connectionId, out channelId, buffer, bufferSize, out receivedSize, out error);

		switch(ne)
		{
			case NetworkEventType.ConnectEvent:
				Debug.Log("Client connected!");
				break;
			case NetworkEventType.DataEvent:
				Debug.Log("Received data from client!");
		}
	}
	
}

Connecting to a server and sending a message

public class MyObject
{
	private ZeroTierNetworkInterface zt;

	void Start()
	{
		zt = new ZeroTierNetworkInterface("/Users/Bob/UnityGame/nc_8c493f5bef1747a6");

		byte error;
		int conn_id = zt.Connect(0, "192.168.0.50", "8080", out error);

		if(conn_id) {
			zt.Send(conn_id, "Welcome to the machine!", 24, error);
		}
		else {
			Debug.Log("Unable to connect to host");
		}

	}
}