RX API improvements

This commit is contained in:
Joseph Henry
2016-06-17 14:53:46 -07:00
parent 8fa7372e87
commit 53e71434f8
4 changed files with 100 additions and 78 deletions

View File

@@ -4,6 +4,7 @@ using System.Threading;
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Binary;
using System.IO; using System.IO;
using UnityEngine.UI; using UnityEngine.UI;
using UnityEngine.Networking;
public class Demo : MonoBehaviour public class Demo : MonoBehaviour
{ {
@@ -131,13 +132,13 @@ public class Demo : MonoBehaviour
input.text = "172.22.211.245"; input.text = "172.22.211.245";
go = GameObject.Find ("inputServerPort"); go = GameObject.Find ("inputServerPort");
input = go.GetComponents<InputField> () [0]; input = go.GetComponents<InputField> () [0];
input.text = "8888"; input.text = "8887";
go = GameObject.Find ("inputMessage"); go = GameObject.Find ("inputMessage");
input = go.GetComponents<InputField> () [0]; input = go.GetComponents<InputField> () [0];
input.text = "Welcome to the machine"; input.text = "Welcome to the machine";
// Create new instance of ZeroTier in separate thread // Create new instance of ZeroTier in separate thread
zt = new ZeroTierNetworkInterface ("/Users/Joseph/utest2"); zt = new ZeroTierNetworkInterface ("/Users/Joseph/utest2/nc_565799d8f6e1c11a");
/* This new instance will communicate via a named pipe, so any /* This new instance will communicate via a named pipe, so any
* API calls (ZeroTier.Connect(), ZeroTier.Send(), etc) will be sent to the service * API calls (ZeroTier.Connect(), ZeroTier.Send(), etc) will be sent to the service
@@ -153,6 +154,38 @@ public class Demo : MonoBehaviour
// Update is called once per frame // Update is called once per frame
void Update () { 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"); GameObject go = GameObject.Find ("_txtStatusIndicator");
@@ -169,14 +202,8 @@ public class Demo : MonoBehaviour
Vector3 rotvec = new Vector3 (10f, 10f, 10f); Vector3 rotvec = new Vector3 (10f, 10f, 10f);
go.transform.Rotate (rotvec, speed * Time.deltaTime); go.transform.Rotate (rotvec, speed * Time.deltaTime);
} }
*/
/*
GameObject go = GameObject.Find("ZTCube"); GameObject go = GameObject.Find("ZTCube");
Text text = go.GetComponents<Text> ()[0]; Text text = go.GetComponents<Text> ()[0];
if (text) {
text.text = IsRunning() ? "ZeroTier Status: Online" : "ZeroTier Status: Offline";
}
*/ */
} }
} }

View File

@@ -114,7 +114,9 @@ public class ZeroTierNetworkInterface {
[DllImport (DLL_PATH)] [DllImport (DLL_PATH)]
unsafe private static extern int zt_recv(int sockfd, string buf, int len); unsafe private static extern int zt_recv(int sockfd, string buf, int len);
[DllImport (DLL_PATH)] [DllImport (DLL_PATH)]
unsafe private static extern int zt_send(int sockfd, string buf, int len); 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 // ZT Thread controls
[DllImport (DLL_PATH)] [DllImport (DLL_PATH)]
@@ -140,6 +142,7 @@ public class ZeroTierNetworkInterface {
Marshal.GetFunctionPointerForDelegate(callback_delegate); Marshal.GetFunctionPointerForDelegate(callback_delegate);
// Call the API passing along the function pointer. // Call the API passing along the function pointer.
SetDebugFunction( intptr_delegate ); SetDebugFunction( intptr_delegate );
Debug.Log ("rpc_path = " + rpc_path);
unity_start_service (rpc_path); unity_start_service (rpc_path);
} }
@@ -202,6 +205,10 @@ public class ZeroTierNetworkInterface {
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr("0.0.0.0" + ":" + port); GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr("0.0.0.0" + ":" + port);
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject (); IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
int addrlen = Marshal.SizeOf (pSockAddr); 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); return zt_bind (sockfd, pSockAddr, addrlen);
} }
@@ -219,6 +226,10 @@ public class ZeroTierNetworkInterface {
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject (); IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
int addrlen = Marshal.SizeOf (pSockAddr); int addrlen = Marshal.SizeOf (pSockAddr);
error = (byte)zt_connect (sockfd, pSockAddr, addrlen); error = (byte)zt_connect (sockfd, pSockAddr, addrlen);
// Set socket to non-blocking for RX polling in Receive()
zt_set_nonblock(sockfd);
return sockfd; return sockfd;
} }
@@ -239,32 +250,9 @@ public class ZeroTierNetworkInterface {
{ {
return zt_close (fd); return zt_close (fd);
} }
// Sends data out over the network
/*
public int Send(int fd, char[] buf, int len, out byte error)
{
int bytes_written = 0;
error = 0;
GCHandle buf_handle = GCHandle.Alloc (buf, GCHandleType.Pinned);
IntPtr pBufPtr = buf_handle.AddrOfPinnedObject ();
if((bytes_written = zt_send (fd, pBufPtr, len)) < 0) {
error = (byte)bytes_written;
}
return bytes_written;
}
*/
// Structure used to house arrays meant to be sent to unmanaged memory and passed to the
// ZeroTier service
public struct UnityArrayInput
{
public IntPtr array;
}
// Write data to a ZeroTier socket // Write data to a ZeroTier socket
/*
public int Send(int fd, char[] buf, int len, out byte error) public int Send(int fd, char[] buf, int len, out byte error)
{ {
GCHandle buf_handle = GCHandle.Alloc (buf, GCHandleType.Pinned); GCHandle buf_handle = GCHandle.Alloc (buf, GCHandleType.Pinned);
@@ -278,41 +266,52 @@ public class ZeroTierNetworkInterface {
} }
return bytes_written; return bytes_written;
} }
// Sends data out over the network
/*
public int Send(int fd, char[] bufx, int len, out byte error)
{
char[] buf = "this is another test".ToCharArray();
UnityArrayInput data = new UnityArrayInput ();
data.array = Marshal.AllocHGlobal (Marshal.SizeOf (typeof(char))*buf.Length);
//data.len = buf.Length;
int bytes_written = 0;
error = 0;
try
{
//Marshal.Copy(buf, 0, data.array, buf.Length);
Debug.Log(buf.Length);
// ZT API call
if((bytes_written = zt_send (fd, data.array, buf.Length)) < 0) {
error = (byte)bytes_written;
}
return bytes_written;
}
finally
{
Marshal.FreeHGlobal (data.array);
}
return 0;
}
*/ */
// Checks for data to RX // Write data to a ZeroTier socket
public int OnReceive(int fd, byte[] buf, int len) public int Send(int fd, char[] buf, int len, out byte error)
{ {
return 0; GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
//return zt_read(fd, buf, len); 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)
{
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
}
} }
} }

View File

@@ -74,6 +74,7 @@ ssize_t zt_recvmsg(RECVMSG_SIG);
#if defined(__UNITY_3D__) #if defined(__UNITY_3D__)
ssize_t zt_recv(int fd, void *buf, int len); ssize_t zt_recv(int fd, void *buf, int len);
ssize_t zt_send(int fd, void *buf, int len); ssize_t zt_send(int fd, void *buf, int len);
int zt_set_nonblock(int fd);
#endif #endif

View File

@@ -303,6 +303,8 @@ const char *get_netpath() {
#if defined(__UNITY_3D__) #if defined(__UNITY_3D__)
// Just expose some basic calls for configuring and RX/TXing through ZT sockets
ssize_t zt_send(int fd, void *buf, int len) ssize_t zt_send(int fd, void *buf, int len)
{ {
return write(fd, buf, len); return write(fd, buf, len);
@@ -313,17 +315,10 @@ const char *get_netpath() {
return read(fd, buf, len); return read(fd, buf, len);
} }
/* int zt_set_nonblock(int fd)
ssize_t zt_send(int fd, struct UnityArrayInput *buf, int len) {
{ return fcntl(fd, F_SETFL, O_NONBLOCK);
return write(fd, buf->array, len); }
}
ssize_t zt_recv(int fd, struct UnityArrayInput *buf, int len)
{
return read(fd, buf->array, len);
}
*/
#endif #endif
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------