Outlined UDP support
This commit is contained in:
Binary file not shown.
@@ -113,6 +113,11 @@ public class ZeroTierNetworkInterface {
|
|||||||
[DllImport (DLL_PATH)]
|
[DllImport (DLL_PATH)]
|
||||||
unsafe protected static extern int zt_set_nonblock(int sockfd);
|
unsafe protected static extern int zt_set_nonblock(int sockfd);
|
||||||
|
|
||||||
|
[DllImport (DLL_PATH)]
|
||||||
|
unsafe protected static extern int zt_sendto(int fd, IntPtr buf, int len, int flags, System.IntPtr addr, int addrlen);
|
||||||
|
[DllImport (DLL_PATH)]
|
||||||
|
unsafe protected static extern int zt_recvfrom(int fd, [In, Out] IntPtr buf, int len, int flags, System.IntPtr addr, int addrlen);
|
||||||
|
|
||||||
// ZT Thread controls
|
// ZT Thread controls
|
||||||
[DllImport (DLL_PATH)]
|
[DllImport (DLL_PATH)]
|
||||||
protected static extern bool zt_is_running();
|
protected static extern bool zt_is_running();
|
||||||
@@ -307,6 +312,42 @@ public class ZeroTierNetworkInterface {
|
|||||||
return bytes_written;
|
return bytes_written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sends data to an address
|
||||||
|
public int SendTo(int fd, char[] buf, int len, int flags, string addr, int port)
|
||||||
|
{
|
||||||
|
GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
||||||
|
IntPtr ptr = handle.AddrOfPinnedObject();
|
||||||
|
int bytes_written;
|
||||||
|
|
||||||
|
// Form address structure
|
||||||
|
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(addr + ":" + port);
|
||||||
|
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||||
|
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||||
|
|
||||||
|
if((bytes_written = zt_sendto(fd, ptr, len*2, flags, pSockAddr, addrlen)) < 0) {
|
||||||
|
//error = (byte)bytes_written;
|
||||||
|
}
|
||||||
|
return bytes_written;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Receives data from an address
|
||||||
|
public int RecvFrom(int fd, ref char[] buf, int len, int flags, string addr, int port)
|
||||||
|
{
|
||||||
|
GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
||||||
|
IntPtr ptr = handle.AddrOfPinnedObject();
|
||||||
|
|
||||||
|
// Form address structure
|
||||||
|
GCHandle sockaddr_ptr = ZeroTierUtils.Generate_unmananged_sockaddr(addr + ":" + port);
|
||||||
|
IntPtr pSockAddr = sockaddr_ptr.AddrOfPinnedObject ();
|
||||||
|
int addrlen = Marshal.SizeOf (pSockAddr);
|
||||||
|
|
||||||
|
int bytes_read = zt_recvfrom(fd, ptr, len*2, flags, pSockAddr, addrlen);
|
||||||
|
string str = Marshal.PtrToStringAuto(ptr);
|
||||||
|
//Marshal.Copy (ptr, buf, 0, bytes_read);
|
||||||
|
buf = Marshal.PtrToStringAnsi(ptr).ToCharArray();
|
||||||
|
return bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
#region Service-Related calls
|
#region Service-Related calls
|
||||||
// Returns whether the ZeroTier service is currently running
|
// Returns whether the ZeroTier service is currently running
|
||||||
public bool IsRunning()
|
public bool IsRunning()
|
||||||
|
|||||||
Reference in New Issue
Block a user