introduced a prettier and less complex API for iOS/OSX framework usage
This commit is contained in:
@@ -1424,6 +1424,7 @@
|
|||||||
"-D__IOS__",
|
"-D__IOS__",
|
||||||
"-DLWIP_DEBUG",
|
"-DLWIP_DEBUG",
|
||||||
"-DSDK_BUNDLED",
|
"-DSDK_BUNDLED",
|
||||||
|
"-DUSING_BRIDGING_HEADER",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
|
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1457,6 +1458,7 @@
|
|||||||
"-DSDK",
|
"-DSDK",
|
||||||
"-D__IOS__",
|
"-D__IOS__",
|
||||||
"-DSDK_BUNDLED",
|
"-DSDK_BUNDLED",
|
||||||
|
"-DUSING_BRIDGING_HEADER",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
|
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1492,6 +1494,7 @@
|
|||||||
"-DSDK_DEBUG",
|
"-DSDK_DEBUG",
|
||||||
"-D__XCODE__",
|
"-D__XCODE__",
|
||||||
"-DLWIP_DEBUG",
|
"-DLWIP_DEBUG",
|
||||||
|
"-DUSING_BRIDGING_HEADER",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
|
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1522,6 +1525,7 @@
|
|||||||
"-DSDK_SERVICE",
|
"-DSDK_SERVICE",
|
||||||
"-DSDK_BUNDLED",
|
"-DSDK_BUNDLED",
|
||||||
"-D__XCODE__",
|
"-D__XCODE__",
|
||||||
|
"-DUSING_BRIDGING_HEADER",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
|
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
7C1345841D80CDD700AF7FD1 /* ZTSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */; };
|
||||||
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */; };
|
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */; };
|
||||||
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03D1D3348A6001E1B6F /* ViewController.swift */; };
|
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03D1D3348A6001E1B6F /* ViewController.swift */; };
|
||||||
7C8BC0411D3348A6001E1B6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC03F1D3348A6001E1B6F /* Main.storyboard */; };
|
7C8BC0411D3348A6001E1B6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC03F1D3348A6001E1B6F /* Main.storyboard */; };
|
||||||
@@ -32,6 +33,7 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ZTSDK.swift; path = ../../../../../src/ZTSDK.swift; sourceTree = "<group>"; };
|
||||||
7C8BC0381D3348A6001E1B6F /* Example_iOS_App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example_iOS_App.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
7C8BC0381D3348A6001E1B6F /* Example_iOS_App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example_iOS_App.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7C8BC03D1D3348A6001E1B6F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
7C8BC03D1D3348A6001E1B6F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||||
@@ -76,6 +78,7 @@
|
|||||||
7C8BC03A1D3348A6001E1B6F /* Example_iOS_App */ = {
|
7C8BC03A1D3348A6001E1B6F /* Example_iOS_App */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */,
|
||||||
7CE8BFA91D3C553400350023 /* SDK_XcodeWrapper.cpp */,
|
7CE8BFA91D3C553400350023 /* SDK_XcodeWrapper.cpp */,
|
||||||
7CE8BFAA1D3C553400350023 /* SDK_XcodeWrapper.hpp */,
|
7CE8BFAA1D3C553400350023 /* SDK_XcodeWrapper.hpp */,
|
||||||
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */,
|
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */,
|
||||||
@@ -163,6 +166,7 @@
|
|||||||
files = (
|
files = (
|
||||||
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */,
|
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */,
|
||||||
7CE8BFAB1D3C553400350023 /* SDK_XcodeWrapper.cpp in Sources */,
|
7CE8BFAB1D3C553400350023 /* SDK_XcodeWrapper.cpp in Sources */,
|
||||||
|
7C1345841D80CDD700AF7FD1 /* ZTSDK.swift in Sources */,
|
||||||
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */,
|
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
|||||||
@@ -10,11 +10,11 @@
|
|||||||
ignoreCount = "0"
|
ignoreCount = "0"
|
||||||
continueAfterRunningActions = "No"
|
continueAfterRunningActions = "No"
|
||||||
filePath = "Example_iOS_App/ViewController.swift"
|
filePath = "Example_iOS_App/ViewController.swift"
|
||||||
timestampString = "492476189.334255"
|
timestampString = "494987032.463726"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "56"
|
startingLineNumber = "54"
|
||||||
endingLineNumber = "56"
|
endingLineNumber = "54"
|
||||||
landmarkName = "UI_TX(_:)"
|
landmarkName = "UI_TX(_:)"
|
||||||
landmarkType = "5">
|
landmarkType = "5">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
ignoreCount = "0"
|
ignoreCount = "0"
|
||||||
continueAfterRunningActions = "No"
|
continueAfterRunningActions = "No"
|
||||||
filePath = "Example_iOS_App/ViewController.swift"
|
filePath = "Example_iOS_App/ViewController.swift"
|
||||||
timestampString = "492477955.572263"
|
timestampString = "494987032.463726"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "249"
|
startingLineNumber = "230"
|
||||||
endingLineNumber = "249"
|
endingLineNumber = "230"
|
||||||
landmarkName = "update_rx()"
|
landmarkName = "update_rx()"
|
||||||
landmarkType = "5">
|
landmarkType = "5">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
@@ -42,14 +42,78 @@
|
|||||||
ignoreCount = "0"
|
ignoreCount = "0"
|
||||||
continueAfterRunningActions = "No"
|
continueAfterRunningActions = "No"
|
||||||
filePath = "Example_iOS_App/ViewController.swift"
|
filePath = "Example_iOS_App/ViewController.swift"
|
||||||
timestampString = "492482204.82335"
|
timestampString = "494987032.463726"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "283"
|
startingLineNumber = "261"
|
||||||
endingLineNumber = "283"
|
endingLineNumber = "261"
|
||||||
landmarkName = "update_rx()"
|
landmarkName = "update_rx()"
|
||||||
landmarkType = "5">
|
landmarkType = "5">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
|
<BreakpointProxy
|
||||||
|
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||||
|
<BreakpointContent
|
||||||
|
shouldBeEnabled = "No"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
filePath = "Example_iOS_App/ZTSDK.swift"
|
||||||
|
timestampString = "494980386.753348"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "44"
|
||||||
|
endingLineNumber = "44"
|
||||||
|
landmarkName = "join_network(_:)"
|
||||||
|
landmarkType = "5">
|
||||||
|
</BreakpointContent>
|
||||||
|
</BreakpointProxy>
|
||||||
|
<BreakpointProxy
|
||||||
|
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||||
|
<BreakpointContent
|
||||||
|
shouldBeEnabled = "No"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
filePath = "Example_iOS_App/ZTSDK.swift"
|
||||||
|
timestampString = "494980195.451716"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "17"
|
||||||
|
endingLineNumber = "17"
|
||||||
|
landmarkName = "ztnc_start_service(_:)"
|
||||||
|
landmarkType = "5">
|
||||||
|
</BreakpointContent>
|
||||||
|
</BreakpointProxy>
|
||||||
|
<BreakpointProxy
|
||||||
|
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||||
|
<BreakpointContent
|
||||||
|
shouldBeEnabled = "No"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
filePath = "../../../../src/ZTSDK.swift"
|
||||||
|
timestampString = "494987032.463726"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "34"
|
||||||
|
endingLineNumber = "34"
|
||||||
|
landmarkName = "to_sockaddr_in()"
|
||||||
|
landmarkType = "5">
|
||||||
|
</BreakpointContent>
|
||||||
|
</BreakpointProxy>
|
||||||
|
<BreakpointProxy
|
||||||
|
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||||
|
<BreakpointContent
|
||||||
|
shouldBeEnabled = "No"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
filePath = "../../../../src/ZTSDK.swift"
|
||||||
|
timestampString = "494987032.463726"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "148"
|
||||||
|
endingLineNumber = "148"
|
||||||
|
landmarkName = "listen(_:backlog:)"
|
||||||
|
landmarkType = "5">
|
||||||
|
</BreakpointContent>
|
||||||
|
</BreakpointProxy>
|
||||||
</Breakpoints>
|
</Breakpoints>
|
||||||
</Bucket>
|
</Bucket>
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ import UIKit
|
|||||||
|
|
||||||
class ViewController: UIViewController {
|
class ViewController: UIViewController {
|
||||||
|
|
||||||
var serverPort:UInt16 = 8080
|
let zt = ZTSDK();
|
||||||
|
|
||||||
|
var serverPort:Int16 = 8080
|
||||||
var serverAddr:String = "10.9.9.100"
|
var serverAddr:String = "10.9.9.100"
|
||||||
var selectedProtocol:Int32 = 0
|
var selectedProtocol:Int32 = 0
|
||||||
var sock:Int32 = -1
|
var sock:Int32 = -1
|
||||||
@@ -29,18 +31,16 @@ class ViewController: UIViewController {
|
|||||||
// Use ordinary read/write calls on ZeroTier socket
|
// Use ordinary read/write calls on ZeroTier socket
|
||||||
|
|
||||||
// TCP
|
// TCP
|
||||||
if(selectedProtocol == SOCK_STREAM)
|
if(selectedProtocol == SOCK_STREAM) {
|
||||||
{
|
|
||||||
var buffer = [UInt8](count: 100, repeatedValue: 0)
|
var buffer = [UInt8](count: 100, repeatedValue: 0)
|
||||||
read(accepted_sock, &buffer, 100);
|
read(accepted_sock, &buffer, 100);
|
||||||
print(buffer)
|
print(buffer)
|
||||||
|
|
||||||
}
|
}
|
||||||
// UDP
|
// UDP
|
||||||
if(selectedProtocol == SOCK_DGRAM)
|
if(selectedProtocol == SOCK_DGRAM) {
|
||||||
{
|
|
||||||
var buffer = [UInt8](count: 100, repeatedValue: 0)
|
var buffer = [UInt8](count: 100, repeatedValue: 0)
|
||||||
read(sock, &buffer, 100);
|
read(Int32(sock), &buffer, 100);
|
||||||
print(buffer)
|
print(buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,16 +48,13 @@ class ViewController: UIViewController {
|
|||||||
|
|
||||||
@IBAction func UI_TX(sender: AnyObject) {
|
@IBAction func UI_TX(sender: AnyObject) {
|
||||||
// Use ordinary read/write calls on ZeroTier socket
|
// Use ordinary read/write calls on ZeroTier socket
|
||||||
|
|
||||||
// TCP
|
// TCP
|
||||||
if(selectedProtocol == SOCK_STREAM)
|
if(selectedProtocol == SOCK_STREAM) {
|
||||||
{
|
write(Int32(sock), txtTX.description, txtTX.description.characters.count);
|
||||||
write(sock, txtTX.description, txtTX.description.characters.count);
|
|
||||||
}
|
}
|
||||||
// UDP
|
// UDP
|
||||||
if(selectedProtocol == SOCK_DGRAM)
|
if(selectedProtocol == SOCK_DGRAM) {
|
||||||
{
|
sendto(Int32(sock), txtTX.description, txtTX.description.characters.count, 0, UnsafePointer<sockaddr>([udp_addr]), UInt32(udp_addr.sin_len))
|
||||||
sendto(sock, txtTX.description, txtTX.description.characters.count, 0, UnsafePointer<sockaddr>([udp_addr]), UInt32(udp_addr.sin_len))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,12 +63,12 @@ class ViewController: UIViewController {
|
|||||||
|
|
||||||
@IBOutlet weak var btnJoinNetwork: UIButton!
|
@IBOutlet weak var btnJoinNetwork: UIButton!
|
||||||
@IBAction func UI_JoinNetwork(sender: AnyObject) {
|
@IBAction func UI_JoinNetwork(sender: AnyObject) {
|
||||||
zt_join_network(txtNWID.text!)
|
zt.join_network(txtNWID.text!)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBOutlet weak var btnLeaveNetwork: UIButton!
|
@IBOutlet weak var btnLeaveNetwork: UIButton!
|
||||||
@IBAction func UI_LeaveNetwork(sender: AnyObject) {
|
@IBAction func UI_LeaveNetwork(sender: AnyObject) {
|
||||||
zt_leave_network(txtNWID.text!)
|
zt.leave_network(txtNWID.text!)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBOutlet weak var segmentProtocol: UISegmentedControl!
|
@IBOutlet weak var segmentProtocol: UISegmentedControl!
|
||||||
@@ -95,16 +92,10 @@ class ViewController: UIViewController {
|
|||||||
// TCP
|
// TCP
|
||||||
if(selectedProtocol == SOCK_STREAM)
|
if(selectedProtocol == SOCK_STREAM)
|
||||||
{
|
{
|
||||||
sock = zt_socket(AF_INET, SOCK_STREAM, 0)
|
sock = zt.socket(AF_INET, socket_type: SOCK_STREAM, socket_protocol: 0)
|
||||||
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
|
||||||
sin_family: UInt8(AF_INET),
|
let connect_err = zt.connect(sock, addr: ztaddr)
|
||||||
sin_port: UInt16(serverPort).bigEndian,
|
|
||||||
sin_addr: in_addr(s_addr: 0),
|
|
||||||
sin_zero: (0,0,0,0,0,0,0,0))
|
|
||||||
|
|
||||||
inet_pton(AF_INET, serverAddr, &(addr.sin_addr));
|
|
||||||
|
|
||||||
let connect_err = zt_connect(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
|
|
||||||
print("connect_err = \(connect_err),\(errno)")
|
print("connect_err = \(connect_err),\(errno)")
|
||||||
|
|
||||||
if connect_err < 0 {
|
if connect_err < 0 {
|
||||||
@@ -138,16 +129,9 @@ class ViewController: UIViewController {
|
|||||||
// TCP
|
// TCP
|
||||||
if(selectedProtocol == SOCK_STREAM)
|
if(selectedProtocol == SOCK_STREAM)
|
||||||
{
|
{
|
||||||
sock = zt_socket(AF_INET, SOCK_STREAM, 0)
|
sock = Int16(zt_socket(AF_INET, SOCK_STREAM, 0))
|
||||||
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
|
||||||
sin_family: UInt8(AF_INET),
|
let bind_err = zt.bind(sock, addr: ztaddr)
|
||||||
sin_port: UInt16(serverPort).bigEndian,
|
|
||||||
sin_addr: in_addr(s_addr: 0),
|
|
||||||
sin_zero: (0,0,0,0,0,0,0,0))
|
|
||||||
|
|
||||||
inet_pton(AF_INET, serverAddr, &(addr.sin_addr));
|
|
||||||
|
|
||||||
let bind_err = zt_bind(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
|
|
||||||
|
|
||||||
print("bind_err = \(bind_err),\(errno)")
|
print("bind_err = \(bind_err),\(errno)")
|
||||||
|
|
||||||
@@ -158,13 +142,13 @@ class ViewController: UIViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Put socket into listening state
|
// Put socket into listening state
|
||||||
zt_listen(sock, 1);
|
zt_listen(Int32(sock), 1);
|
||||||
|
|
||||||
// Accept connection
|
// Accept connection
|
||||||
var len:socklen_t = 0;
|
var len:socklen_t = 0;
|
||||||
var legIntPtr = withUnsafeMutablePointer(&len, { $0 })
|
var legIntPtr = withUnsafeMutablePointer(&len, { $0 })
|
||||||
while(accepted_sock < 0) {
|
while(accepted_sock < 0) {
|
||||||
accepted_sock = zt_accept(sock, UnsafeMutablePointer<sockaddr>([addr]), legIntPtr)
|
accepted_sock = zt.accept(sock, addr: ztaddr)
|
||||||
}
|
}
|
||||||
print("accepted connection")
|
print("accepted connection")
|
||||||
}
|
}
|
||||||
@@ -172,18 +156,13 @@ class ViewController: UIViewController {
|
|||||||
// UDP
|
// UDP
|
||||||
if(selectedProtocol == SOCK_DGRAM)
|
if(selectedProtocol == SOCK_DGRAM)
|
||||||
{
|
{
|
||||||
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
|
||||||
sin_family: UInt8(AF_INET),
|
|
||||||
sin_port: UInt16(serverPort).bigEndian,
|
|
||||||
sin_addr: in_addr(s_addr: 0),
|
|
||||||
sin_zero: (0,0,0,0,0,0,0,0))
|
|
||||||
|
|
||||||
|
sock = Int16(zt_socket(AF_INET, SOCK_DGRAM, 0))
|
||||||
sock = zt_socket(AF_INET, SOCK_DGRAM, 0)
|
err = zt.bind(sock, addr: ztaddr)
|
||||||
err = zt_bind(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
|
|
||||||
print("bind_err = ", err)
|
print("bind_err = ", err)
|
||||||
|
|
||||||
err = zt_listen(sock, 0)
|
err = zt.listen(sock, backlog: 0)
|
||||||
print("listen_err = ", err)
|
print("listen_err = ", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -208,13 +187,15 @@ class ViewController: UIViewController {
|
|||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
var str_buf = [Int8](count: 16, repeatedValue: 0)
|
var str_buf = [Int8](count: 16, repeatedValue: 0)
|
||||||
zt_get_addresses(self.txtNWID.text!, &str_buf);
|
print(self.zt.get_address(self.txtNWID.text!)) //, &str_buf);
|
||||||
self.lblAddress.text = String.fromCString(str_buf)
|
self.lblAddress.text = String.fromCString(str_buf)
|
||||||
// print("IPV4 = ", String.fromCString(str_buf))
|
// print("IPV4 = ", String.fromCString(str_buf))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TCP
|
// TCP
|
||||||
if(selectedProtocol == SOCK_STREAM)
|
if(selectedProtocol == SOCK_STREAM)
|
||||||
{
|
{
|
||||||
@@ -233,23 +214,22 @@ class ViewController: UIViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// UDP
|
// UDP
|
||||||
|
/*
|
||||||
if(selectedProtocol == SOCK_DGRAM)
|
if(selectedProtocol == SOCK_DGRAM)
|
||||||
{
|
{
|
||||||
let len = 32
|
let len = 32
|
||||||
var buffer = [UInt8](count: len, repeatedValue: 0)
|
var buffer = [UInt8](count: len, repeatedValue: 0)
|
||||||
|
|
||||||
/*
|
//udp_addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
||||||
udp_addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
// sin_family: UInt8(AF_INET),
|
||||||
sin_family: UInt8(AF_INET),
|
// sin_port: UInt16(0).bigEndian,
|
||||||
sin_port: UInt16(0).bigEndian,
|
// sin_addr: in_addr(s_addr: 0),
|
||||||
sin_addr: in_addr(s_addr: 0),
|
// sin_zero: (0,0,0,0,0,0,0,0))
|
||||||
sin_zero: (0,0,0,0,0,0,0,0))
|
|
||||||
|
|
||||||
var addrlen:socklen_t = 0;
|
|
||||||
var legIntPtr = withUnsafeMutablePointer(&addrlen, { $0 })
|
|
||||||
let n = recvfrom(sock, &buffer, len, 0, UnsafeMutablePointer<sockaddr>([udp_addr]), legIntPtr)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
//var addrlen:socklen_t = 0;
|
||||||
|
//var legIntPtr = withUnsafeMutablePointer(&addrlen, { $0 })
|
||||||
|
//let n = recvfrom(sock, &buffer, len, 0, UnsafeMutablePointer<sockaddr>([udp_addr]), legIntPtr)
|
||||||
|
|
||||||
|
|
||||||
var socketAddress = sockaddr_storage()
|
var socketAddress = sockaddr_storage()
|
||||||
var socketAddressLength = socklen_t(sizeof(sockaddr_storage.self))
|
var socketAddressLength = socklen_t(sizeof(sockaddr_storage.self))
|
||||||
@@ -269,11 +249,9 @@ class ViewController: UIViewController {
|
|||||||
|
|
||||||
print("bytesWritten = ", bytesWritten);
|
print("bytesWritten = ", bytesWritten);
|
||||||
|
|
||||||
/*
|
//let bytesWritten = withUnsafePointer(&socketAddress.sin) {
|
||||||
let bytesWritten = withUnsafePointer(&socketAddress.sin) {
|
// sendto(sock, buffer, len, 0, UnsafePointer($0), socklen_t(socketAddress.sin.sin_len))
|
||||||
sendto(sock, buffer, len, 0, UnsafePointer($0), socklen_t(socketAddress.sin.sin_len))
|
//}
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if let str = String(data: NSData(bytes: &buffer, length: len), encoding: NSUTF8StringEncoding) {
|
if let str = String(data: NSData(bytes: &buffer, length: len), encoding: NSUTF8StringEncoding) {
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
@@ -284,15 +262,9 @@ class ViewController: UIViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ZeroTier service thread
|
|
||||||
var service_thread : NSThread!
|
|
||||||
func ztnc_start_service() {
|
|
||||||
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
|
|
||||||
zt_start_service_and_rpc(path[0],"8056c2e21c000001")
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
@@ -306,11 +278,13 @@ class ViewController: UIViewController {
|
|||||||
|
|
||||||
selectedProtocol = SOCK_STREAM
|
selectedProtocol = SOCK_STREAM
|
||||||
|
|
||||||
// ZeroTier Service thread
|
print("Starting ZeroTier...\n");
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
|
zt.start_service(nil);
|
||||||
self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil)
|
|
||||||
self.service_thread.start()
|
print("Joining network...\n");
|
||||||
});
|
zt.join_network(txtNWID.text!);
|
||||||
|
|
||||||
|
print("Complete\n");
|
||||||
|
|
||||||
// UI RX update
|
// UI RX update
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ void zt_enable_intercept();
|
|||||||
void zt_start_service(const char * path);
|
void zt_start_service(const char * path);
|
||||||
void zt_stop_service();
|
void zt_stop_service();
|
||||||
void zt_start_service_and_rpc(const char * path, const char * nwid);
|
void zt_start_service_and_rpc(const char * path, const char * nwid);
|
||||||
|
bool zt_service_is_running();
|
||||||
void zt_join_network(const char *nwid);
|
void zt_join_network(const char *nwid);
|
||||||
void zt_leave_network(const char *nwid);
|
void zt_leave_network(const char *nwid);
|
||||||
void zt_is_running(const char *nwid);
|
void zt_is_running(const char *nwid);
|
||||||
|
|||||||
182
src/ZTSDK.swift
Normal file
182
src/ZTSDK.swift
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
//
|
||||||
|
// ZTSDK.swift
|
||||||
|
// Example_iOS_App
|
||||||
|
//
|
||||||
|
// Created by Joseph Henry on 9/7/16.
|
||||||
|
// Copyright © 2016 ZeroTier Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// Convenience structure for getting address data to/from the native library
|
||||||
|
struct ZTAddress
|
||||||
|
{
|
||||||
|
var family: Int32
|
||||||
|
var addr: String
|
||||||
|
var port: Int16
|
||||||
|
var data: sockaddr_in?
|
||||||
|
|
||||||
|
init(family: Int32, addr: String, port: Int16)
|
||||||
|
{
|
||||||
|
self.family = family
|
||||||
|
self.addr = addr
|
||||||
|
self.port = port
|
||||||
|
}
|
||||||
|
|
||||||
|
func to_sockaddr_in() -> UnsafePointer<sockaddr>
|
||||||
|
{
|
||||||
|
var data = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
|
||||||
|
sin_family: UInt8(AF_INET),
|
||||||
|
sin_port: UInt16(port).bigEndian,
|
||||||
|
sin_addr: in_addr(s_addr: 0),
|
||||||
|
sin_zero: (0,0,0,0,0,0,0,0))
|
||||||
|
inet_pton(AF_INET, addr, &(data.sin_addr));
|
||||||
|
return UnsafePointer<sockaddr>([data]);
|
||||||
|
}
|
||||||
|
|
||||||
|
func len() -> UInt8
|
||||||
|
{
|
||||||
|
return UInt8(sizeof(sockaddr_in))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Convenience wrapper class for ZeroTier/SDK/Proxy controls
|
||||||
|
// Implemented in terms of SDK_XcodeWrapper.cpp
|
||||||
|
class ZTSDK : NSObject
|
||||||
|
{
|
||||||
|
var service_thread : NSThread!
|
||||||
|
private func ztnc_start_service(path: String?)
|
||||||
|
{
|
||||||
|
if(path == nil) {
|
||||||
|
zt_start_service(
|
||||||
|
NSSearchPathForDirectoriesInDomains(
|
||||||
|
NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)[0])
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
zt_start_service(path!)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Starts the ZeroTier background service
|
||||||
|
func start_service(path: String?)
|
||||||
|
{
|
||||||
|
|
||||||
|
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
|
||||||
|
dispatch_async(queue) {
|
||||||
|
self.ztnc_start_service(path)
|
||||||
|
}
|
||||||
|
sleep(2)
|
||||||
|
while(service_is_running() == false) { /* waiting for service to start */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stops the ZeroTier background service
|
||||||
|
func stop_service()
|
||||||
|
{
|
||||||
|
zt_stop_service();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns whether the ZeroTier background service is running
|
||||||
|
func service_is_running() -> Bool
|
||||||
|
{
|
||||||
|
return zt_service_is_running();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Joins a ZeroTier network
|
||||||
|
func join_network(nwid: String)
|
||||||
|
{
|
||||||
|
zt_join_network(nwid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leaves a ZeroTier network
|
||||||
|
func leave_network(nwid: String)
|
||||||
|
{
|
||||||
|
zt_leave_network(nwid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the address of this device on a given ZeroTier network
|
||||||
|
func get_address(nwid: String) -> (String, String)
|
||||||
|
{
|
||||||
|
// zts_get_addresses(nwid, addrstr);
|
||||||
|
return ("ipv4", "ipv6")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// PROXY SERVER CONTROLS
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
func start_proxy_server(homepath: String, nwid: String, struct sockaddr_storage *addr) {
|
||||||
|
zt_start_proxy_server(homepath, nwid, addr);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
func stop_proxy_server(nwid: String) {
|
||||||
|
zt_stop_proxy_server(nwid);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
func proxy_is_running(const char *homepath, const char *nwid, struct sockaddr_storage *addr) {
|
||||||
|
zt_start_proxy_server(homepath, nwid, addr);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
func get_proxy_server_address(const char *nwid, struct sockaddr_storage *addr) {
|
||||||
|
zt_get_proxy_server_address(nwid, addr);
|
||||||
|
}
|
||||||
|
// Explicit ZT API wrappers
|
||||||
|
#if !defined(__IOS__)
|
||||||
|
// This isn't available for iOS since function interposition isn't as reliable
|
||||||
|
func init_rpc(const char *path, const char *nwid) {
|
||||||
|
zt_init_rpc(path, nwid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// SOCKET API
|
||||||
|
func socket(socket_family: Int32, _ socket_type: Int32, _ socket_protocol: Int32) -> Int16 {
|
||||||
|
return Int16(zt_socket(socket_family, socket_type, socket_protocol));
|
||||||
|
}
|
||||||
|
|
||||||
|
func connect(fd: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_connect(Int32(fd), addr.to_sockaddr_in(), UInt32(addr.len()));
|
||||||
|
}
|
||||||
|
func bind(fd: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_bind(Int32(fd), addr.to_sockaddr_in(), UInt32(addr.len()));
|
||||||
|
}
|
||||||
|
|
||||||
|
func accept(fd: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_accept(Int32(fd), UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
|
||||||
|
}
|
||||||
|
|
||||||
|
func listen(fd: Int32, _ backlog: Int16) -> Int32 {
|
||||||
|
return zt_listen(Int32(fd), Int32(backlog));
|
||||||
|
}
|
||||||
|
func setsockopt(fd: Int32, _ level: Int32, _ optname: Int32, _ optval: UnsafePointer<Void>, _ optlen: Int32) -> Int32 {
|
||||||
|
return zt_setsockopt(fd, level, optname, optval, UInt32(optlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
func getsockopt(fd: Int32, _ level: Int32, _ optname: Int32, _ optval: UnsafeMutablePointer<Void>, _ optlen: UInt32) -> Int32 {
|
||||||
|
return zt_getsockopt(fd, level, optname, optval, UnsafeMutablePointer<UInt32>([optlen]));
|
||||||
|
}
|
||||||
|
|
||||||
|
func close(fd: Int32) -> Int32 {
|
||||||
|
return zt_close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
func getsockname(fd: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_getsockname(fd, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
|
||||||
|
}
|
||||||
|
|
||||||
|
func getpeername(fd: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_getpeername(fd, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
func fcntl(fd: Int32, _ cmd: Int32, _ flags: Int32) -> Int32 {
|
||||||
|
return zt_fcntl(fd, cmd, flags);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
func recvfrom(fd: Int32, _ buf: UnsafeMutablePointer<Void>, _ len: Int32, _ flags: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_recvfrom(fd, buf, Int(len), flags, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendto(fd: Int32, _ buf: UnsafePointer<Void>, _ len: Int32, _ flags: Int32, _ addr: ZTAddress) -> Int32 {
|
||||||
|
return zt_sendto(fd, buf, Int(len), flags, addr.to_sockaddr_in(), UInt32(addr.len()));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user