Как выбрать сетевой интерфейс для использования в моем приложении Какао
Я пытаюсь запустить тест в разных сетях. Я могу переключаться между двумя соединениями 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
") вверх или вниз между тестами.