diff --git a/integrations/apple/example_app/OSX/Example_OSX_App.xcodeproj/project.pbxproj b/integrations/apple/example_app/OSX/Example_OSX_App.xcodeproj/project.pbxproj index 5120409..4d06790 100644 --- a/integrations/apple/example_app/OSX/Example_OSX_App.xcodeproj/project.pbxproj +++ b/integrations/apple/example_app/OSX/Example_OSX_App.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 7C0C03D51D832599009C0827 /* ZTSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C0C03D41D832599009C0827 /* ZTSDK.swift */; }; 7C74DACF1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C74DACD1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.cpp */; }; 7C74DAD21D3C47D300A6C0B9 /* ZeroTierSDK_OSX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C74DAD01D3C472C00A6C0B9 /* ZeroTierSDK_OSX.framework */; }; 7C74DAD31D3C485800A6C0B9 /* ZeroTierSDK_OSX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C74DAD01D3C472C00A6C0B9 /* ZeroTierSDK_OSX.framework */; }; @@ -32,6 +33,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 7C0C03D41D832599009C0827 /* ZTSDK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ZTSDK.swift; path = ../../../../../src/ZTSDK.swift; sourceTree = ""; }; 7C74DACD1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SDK_XcodeWrapper.cpp; path = ../../../../../src/SDK_XcodeWrapper.cpp; sourceTree = ""; }; 7C74DACE1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = SDK_XcodeWrapper.hpp; path = ../../../../../src/SDK_XcodeWrapper.hpp; sourceTree = ""; }; 7C74DAD01D3C472C00A6C0B9 /* ZeroTierSDK_OSX.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ZeroTierSDK_OSX.framework; path = ../../../../build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework; sourceTree = ""; }; @@ -76,6 +78,7 @@ 7CFCB42F1D1AFEE800D3E66C /* Example_OSX_App */ = { isa = PBXGroup; children = ( + 7C0C03D41D832599009C0827 /* ZTSDK.swift */, 7C74DACD1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.cpp */, 7C74DACE1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.hpp */, 7CFCB4301D1AFEE800D3E66C /* AppDelegate.swift */, @@ -160,6 +163,7 @@ files = ( 7CFCB4331D1AFEE800D3E66C /* ViewController.swift in Sources */, 7C74DACF1D3C46EB00A6C0B9 /* SDK_XcodeWrapper.cpp in Sources */, + 7C0C03D51D832599009C0827 /* ZTSDK.swift in Sources */, 7CFCB4311D1AFEE800D3E66C /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/integrations/apple/example_app/OSX/Example_OSX_App/ViewController.swift b/integrations/apple/example_app/OSX/Example_OSX_App/ViewController.swift index 3fbcff4..0e2d9eb 100644 --- a/integrations/apple/example_app/OSX/Example_OSX_App/ViewController.swift +++ b/integrations/apple/example_app/OSX/Example_OSX_App/ViewController.swift @@ -10,6 +10,8 @@ import Cocoa class ViewController: NSViewController { + let zt = ZTSDK(); + @IBOutlet weak var btnJoinNetwork: NSButton! @IBOutlet weak var btnLeaveNetwork: NSButton! @IBOutlet weak var txtNWID: NSTextField! @@ -25,7 +27,6 @@ class ViewController: NSViewController { var serverPort:Int32 = 8080 var serverAddr:String = "0.0.0.0" - var sock:Int32 = -1 var accepted_sock:Int32 = -1 @@ -41,12 +42,12 @@ class ViewController: NSViewController { // Join a ZeroTier network @IBAction func UI_JoinNetwork(sender: AnyObject) { - zt_join_network(txtNWID.stringValue); + zt.join_network(txtNWID.stringValue); } // Leave a ZeroTier network @IBAction func UI_LeaveNetwork(sender: AnyObject) { - zt_leave_network(txtNWID.stringValue); + zt.leave_network(txtNWID.stringValue); } // Select an API @@ -78,18 +79,11 @@ class ViewController: NSViewController { // TCP if(selectedProtocol == SOCK_STREAM) { - sock = zt_socket(AF_INET, SOCK_STREAM, 0) - var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), - 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 = zt.socket(AF_INET, SOCK_STREAM, 0) + let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, Int16(serverPort)) + let connect_err = zt.connect(sock, ztaddr) - inet_pton(AF_INET, serverAddr, &(addr.sin_addr)); - - let connect_err = zt_connect(sock, UnsafePointer([addr]), UInt32(addr.sin_len)) print("connect_err = \(connect_err),\(errno)") - if connect_err < 0 { let err = errno print("Error connecting IPv4 socket \(err)") @@ -116,36 +110,24 @@ class ViewController: NSViewController { var bind_thread : NSThread! func attempt_bind() { - sock = zt_socket(AF_INET, SOCK_STREAM, 0) - var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), - 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 = zt.socket(AF_INET, SOCK_STREAM, 0) + let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, Int16(serverPort)) + let bind_err = zt.bind(sock, ztaddr) + + print("bind_err = \(bind_err),\(errno)") + if bind_err < 0 { + let err = errno + print("Error binding IPv4 socket \(err)") + return + } - inet_pton(AF_INET, serverAddr, &(addr.sin_addr)); - - let bind_err = zt_bind(sock, UnsafePointer([addr]), UInt32(addr.sin_len)) - - print("bind_err = \(bind_err),\(errno)") - - if bind_err < 0 { - let err = errno - print("Error binding IPv4 socket \(err)") - return - } - - // Put socket into listening state - zt_listen(sock, 1); - - // Accept connection - var len:socklen_t = 0; - var legIntPtr = withUnsafeMutablePointer(&len, { $0 }) + // Put socket into listening state + zt_listen(sock, 1); // TCP if(selectedProtocol == SOCK_STREAM) { while(accepted_sock < 0) { - accepted_sock = zt_accept(sock, UnsafeMutablePointer([addr]), legIntPtr) + accepted_sock = zt.accept(sock, ztaddr) } print("accepted connection") } @@ -205,14 +187,14 @@ class ViewController: NSViewController { { sleep(1) dispatch_async(dispatch_get_main_queue()) { - var str_buf = [Int8](count: 16, repeatedValue: 0) - zt_get_addresses(self.txtNWID.stringValue, &str_buf); - print("IPV4 = ", String.fromCString(str_buf)) + //var str_buf = [Int8](count: 16, repeatedValue: 0) + //zt_get_addresses(self.txtNWID.stringValue, &str_buf); + //print("IPV4 = ", String.fromCString(str_buf)) } // TCP if(selectedProtocol == SOCK_STREAM) { - var len = 32 + let len = 32 var buffer = [UInt8](count: len, repeatedValue: 0) let n = read(accepted_sock, &buffer, len); if(n > 0) @@ -292,11 +274,12 @@ class ViewController: NSViewController { txtPort.intValue = serverPort txtNWID.stringValue = "8056c2e21c000001" - // ZeroTier Service thread - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { - self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil) - self.service_thread.start() - }); + selectedProtocol = SOCK_STREAM + print("Starting ZeroTier...\n"); + zt.start_service(nil); + print("Joining network...\n"); + zt.join_network(txtNWID.stringValue); + print("Complete\n"); // Update UI on RX of data dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { diff --git a/integrations/apple/example_app/iOS/Example_iOS_App/ViewController.swift b/integrations/apple/example_app/iOS/Example_iOS_App/ViewController.swift index 5a58ee8..4454b41 100644 --- a/integrations/apple/example_app/iOS/Example_iOS_App/ViewController.swift +++ b/integrations/apple/example_app/iOS/Example_iOS_App/ViewController.swift @@ -93,11 +93,10 @@ class ViewController: UIViewController { if(selectedProtocol == SOCK_STREAM) { sock = zt.socket(AF_INET, SOCK_STREAM, 0) - let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort) + let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, serverPort) let connect_err = zt.connect(sock, ztaddr) print("connect_err = \(connect_err),\(errno)") - if connect_err < 0 { let err = errno print("Error connecting IPv4 socket \(err)") @@ -130,7 +129,7 @@ class ViewController: UIViewController { if(selectedProtocol == SOCK_STREAM) { sock = zt_socket(AF_INET, SOCK_STREAM, 0) - let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort) + let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, serverPort) let bind_err = zt.bind(sock, ztaddr) print("bind_err = \(bind_err),\(errno)") @@ -144,9 +143,6 @@ class ViewController: UIViewController { // Put socket into listening state zt_listen(Int32(sock), 1); - // Accept connection - var len:socklen_t = 0; - var legIntPtr = withUnsafeMutablePointer(&len, { $0 }) while(accepted_sock < 0) { accepted_sock = zt.accept(sock, ztaddr) } @@ -156,7 +152,7 @@ class ViewController: UIViewController { // UDP if(selectedProtocol == SOCK_DGRAM) { - let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort) + let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, serverPort) sock = zt_socket(AF_INET, SOCK_DGRAM, 0) err = zt.bind(sock, ztaddr) @@ -189,9 +185,9 @@ class ViewController: UIViewController { sleep(1) dispatch_async(dispatch_get_main_queue()) { - var str_buf = [Int8](count: 16, repeatedValue: 0) - print(self.zt.get_address(self.txtNWID.text!)) //, &str_buf); - self.lblAddress.text = String.fromCString(str_buf) + //var str_buf = [Int8](count: 16, repeatedValue: 0) + //print(self.zt.get_address(self.txtNWID.text!)) //, &str_buf); + //self.lblAddress.text = String.fromCString(str_buf) // print("IPV4 = ", String.fromCString(str_buf)) } @@ -277,14 +273,10 @@ class ViewController: UIViewController { serverPort = 8080 selectedProtocol = SOCK_STREAM - - sleep(3) print("Starting ZeroTier...\n"); zt.start_service(nil); - print("Joining network...\n"); zt.join_network(txtNWID.text!); - print("Complete\n"); // UI RX update diff --git a/src/SDK_Apple-Bridging-Header.h b/src/SDK_Apple-Bridging-Header.h index 07d4a81..714de39 100644 --- a/src/SDK_Apple-Bridging-Header.h +++ b/src/SDK_Apple-Bridging-Header.h @@ -22,7 +22,9 @@ bool zt_service_is_running(); void zt_join_network(const char *nwid); void zt_leave_network(const char *nwid); void zt_is_running(const char *nwid); -void zt_get_addresses(const char *nwid, char * addrstr); +void zt_get_ipv4_address(const char *nwid, char *addrstr); +void zt_get_ipv6_address(const char *nwid, char *addrstr); + // SOCKS5 PROXY CONTROLS void zt_start_proxy_server(const char *nwid, struct sockaddr_storage addr); diff --git a/src/SDK_XcodeWrapper.cpp b/src/SDK_XcodeWrapper.cpp index ffbddb5..8f9eea7 100755 --- a/src/SDK_XcodeWrapper.cpp +++ b/src/SDK_XcodeWrapper.cpp @@ -61,8 +61,12 @@ extern "C" void zt_leave_network(const char *nwid) { zts_leave_network(nwid); } // Returns a list of addresses associated with this device on the given network -extern "C" void zt_get_addresses(const char *nwid, char *addrstr) { - zts_get_addresses(nwid, addrstr); +extern "C" void zt_get_ipv4_address(const char *nwid, char *addrstr) { + zts_get_ipv4_address(nwid, addrstr); +} +// Returns a list of addresses associated with this device on the given network +extern "C" void zt_get_ipv6_address(const char *nwid, char *addrstr) { + zts_get_ipv6_address(nwid, addrstr); } diff --git a/src/ZTSDK.swift b/src/ZTSDK.swift index 3deb1cb..218d037 100644 --- a/src/ZTSDK.swift +++ b/src/ZTSDK.swift @@ -16,15 +16,13 @@ struct ZTAddress var port: Int16 var data: sockaddr_in? - init(family: Int32, addr: String, port: Int16) - { + init(_ family: Int32, _ addr: String, _ port: Int16) { self.family = family self.addr = addr self.port = port } - func to_sockaddr_in() -> UnsafePointer - { + func to_sockaddr_in() -> UnsafePointer { var data = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), sin_family: UInt8(AF_INET), sin_port: UInt16(port).bigEndian, @@ -34,8 +32,7 @@ struct ZTAddress return UnsafePointer([data]); } - func len() -> UInt8 - { + func len() -> UInt8 { return UInt8(sizeof(sockaddr_in)) } } @@ -46,8 +43,7 @@ struct ZTAddress class ZTSDK : NSObject { var service_thread : NSThread! - private func ztnc_start_service(path: String?) - { + private func ztnc_start_service(path: String?) { if(path == nil) { zt_start_service( NSSearchPathForDirectoriesInDomains( @@ -58,9 +54,7 @@ class ZTSDK : NSObject } // Starts the ZeroTier background service - func start_service(path: String?) - { - + func start_service(path: String?) { let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(queue) { self.ztnc_start_service(path) @@ -70,26 +64,22 @@ class ZTSDK : NSObject } // Stops the ZeroTier background service - func stop_service() - { + func stop_service() { zt_stop_service(); } // Returns whether the ZeroTier background service is running - func service_is_running() -> Bool - { + func service_is_running() -> Bool { return zt_service_is_running(); } // Joins a ZeroTier network - func join_network(nwid: String) - { + func join_network(nwid: String) { zt_join_network(nwid); } // Leaves a ZeroTier network - func leave_network(nwid: String) - { + func leave_network(nwid: String) { zt_leave_network(nwid); }