StunClient

master

Stun client written in Swift for exploration of NAT traversal details (iOS/macOs/Linux)
madmag77/STUNClient

Swift

StunClient

Simple Stun client that connects to Stun server using UDP and asks for your external IP and Port. Can be used both from iOS and macOS.

Requirements

  • iOS 9.0+ / macOS 10.12+
  • Xcode 11+
  • Swift 5.2+

Installation

Swift Package Manager

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.

Just add Stun Client to the dependencies of your Package.swift

dependencies: [
    .package(url: "https://github.com/madmag77/STUNClient.git", .upToNextMajor(from: "1.0.2"))
]

or using Xcode Menu: File->Swift Packages->Add Package Dependency where just insert https://github.com/madmag77/STUNClient.git in the search line.

Manually

In terminal:

git clone https://github.com/madmag77/STUNClient
cd STUNClient 
swift run

You should see the following output:

LOG: Start Who Am I procedure with Stun server 64.233.163.127:19302 from local port 14135
LOG: XOR_MAPPED_ADDRESS 
 Family: 1 
 Port: 54668  
 Address: xxx.xxx.xxx.xxx
COMPLETED, my address: xxx.xxx.xxx.xxx my port: 54668

Then you can try iOS example:

cd iOSExample 
open STUNClient.xcodeproj

Choose simulator and run the project.

Usage

This is how Stun Client can be used (Google Stun IP address and port are being used here):

client = StunClient(stunIpAddress: "64.233.163.127", stunPort: 19302, localPort: UInt16(14135))
let successCallback: (String, Int) -> () = { [weak self] (myAddress: String, myPort: Int) in
        guard let self = self else { return }
        
        print("COMPLETED, my address: \(myAddress) my port: \(myPort)")
}
let errorCallback: (StunError) -> () = { [weak self] error in
            guard let self = self else { return }
            
            print("ERROR: \(error.localizedDescription)")
    }
let verboseCallback: (String) -> () = { [weak self] logText in
            guard let _ = self else { return }
            
            print("LOG: \(logText)")
    }

client
    .whoAmI()
    .ifWhoAmISuccessful(successCallback)
    .ifError(errorCallback)
    .verbose(verboseCallback)
    .start()

Description

  • Swift Tools 5.2.0
View More Packages from this Author

Dependencies

Last updated: Thu Sep 28 2023 13:12:23 GMT-0900 (Hawaii-Aleutian Daylight Time)