Как выбрать сетевой интерфейс для использования в моем приложении Какао

Я пытаюсь запустить тест в разных сетях. Я могу переключаться между двумя соединениями WiFi, но мне нужно знать, как я могу запустить тест на WiFi с подключенным кабелем Ethernet.

В общем, мне нужно запустить тест ping, чтобы проверить, все ли сети на машине работают хорошо или нет. С подключенным портом Ethernet всегда выполняется пинг по Ethernet. Я хотел переключаться между разными сетями. Я могу сделать это на соединениях WiFi без подключения к Ethernet.

5 ответов

Вам придется перейти к использованию сокетов (что вы можете сделать из Objective-C, но это не так просто, как, скажем, загрузить ресурс с помощью NSURL). Насколько я помню, если вы связываетесь с сокетом по IP-адресу интерфейса, который вы хотите использовать, использование этого сокета означает, что вы используете это сетевое соединение.

You need to write a privileged tool helper and then implement some function like this

      func setNetworkLocation(newLocation : String,reply: @escaping (String) -> Void){
    var retVal : Bool = false
    var response = ""
    var prefs : SCPreferences
    prefs = SCPreferencesCreate (nil, "Softech" as CFString, nil)!
    var sets : CFArray
    sets = SCNetworkSetCopyAll (prefs)!
    
    
    let count = CFArrayGetCount(sets)
    var newSet : SCNetworkSet? = nil
    var bFound : Bool = false
    for nIndex  in 0..<count {
     let mySet = CFArrayGetValueAtIndex (sets, nIndex)
     let key = Unmanaged<SCNetworkSet>.fromOpaque(mySet!)
     newSet = key.takeUnretainedValue()
     let name : String = SCNetworkSetGetName(newSet!)! as String
     if(name  == newLocation){
      bFound = true
      break
     }
     print("Name: \(name) cerco \(newLocation)")
    }
    if(bFound){
        print("Trovata netwok location da impostare Name: \(newLocation)")
        retVal = SCNetworkSetSetCurrent (newSet!)
        print ("SCNetworkSetSetCurrent = \(retVal) ");
        retVal = SCPreferencesCommitChanges (prefs);
        print ("SCPreferencesCommitChanges = \(retVal) ")
        response = "setNetworkLocation: SCPreferencesCommitChanges = [\(retVal)] " + newLocation
    }else{
        response = "setNetworkLocation: Not found network location named [" + newLocation + "]"
    }
    reply(response)
}

Usage from application client

      func setNetworkLocation(name: String){
    let xpcService = prepareXPC()?.remoteObjectProxyWithErrorHandler() { error -> Void in
        NSLog("XPC error: \(error)")
        } as? RemoteProcessProtocol

    xpcService?.setNetworkLocation(newLocation:name , reply: { [self]
        responseInfo in
        NSLog("\(name): FGLanSelectionHelper setNetworkLocation response => \(responseInfo)")
        
    })
}

@IBAction func btnSetNetworkLocation(_ sender: Any) {setNetworkLocation(name: "MyOffice")}

Из сети в Системных настройках вы можете установить порядок обслуживания...

Вы можете попробовать GCDAsyncSocket. Вам нужно будет изменить подключения к сокетам. В файле HTTPServer.m во всех примерах вы найдете:

// By default bind on all available interfaces, en1, wifi etc

interface = @"192.168.2.1";

// Use a default port of 0
// This will allow the kernel to automatically pick an open port for us

port = 40000;

Вы можете установить интерфейс как en0,en1 и т. Д. Или напрямую, используя IP-адрес интерфейса, как в приведенном выше примере. Надеюсь, я буду вам полезен.

Другая альтернатива, которую вы могли бы рассмотреть, - это использовать платформу конфигурации системы.

Вы можете использовать такие функции, как " SCNetworkSetSetCurrent msgstr " (чтобы изменить сетевые наборы с одного, где включен только WiFi, на другой, где включен только Ethernet).

Кроме того, если вы не собираетесь выпускать это приложение для широкой публики или через магазин приложений, вы можете сделать из командной строки Terminal/UNIX такие вещи, как " sudo ifconfig " взять конкретный интерфейс (например" en0 ") вверх или вниз между тестами.

Другие вопросы по тегам