У меня возникают проблемы с попыткой пинговать некоторые хосты в рамках моего быстрого приложения
процесс выводит на консоль отладки и, кажется, останавливает что-либо после запуска ... не уверен, что я делаю неправильно, так как я несколько раз пытался заставить это работать, я пробовал вызывать:
task.waitUntilExit () Я пробовал task.terminate () ive даже в конце моей попытки task.terminate ( ) task.waitUntilExit ()
следующее настроено для запуска любых процессов, которые мне нужно запустить в приложении, а их несколько, но если я даже не могу заставить процесс ping работать прямо тогда .... .
import Cocoa
class Processes: NSObject {
func DoTask(command: String, args: [String]) throws -> (String, String, Int32) {
let task = Process()
task.launchPath = command
task.arguments = (args)
let pipe = Pipe()
let outputPipe = pipe
let errorPipe = pipe
try task.run()
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
let output = String(decoding: outputData, as: UTF8.self)
let error = String(decoding: errorData, as: UTF8.self)
task.terminate()
task.waitUntilExit()
return (output, error, task.terminationStatus)
}
}
это вызывается с помощью следующей функции (я собираюсь очистить это и изменить способ его вызова, если я исправлю его, в основном просто разбив его прямо сейчас, чтобы найти, где проблема is)
func PingCheck(IP: String) throws -> (String, String, Int32){
let command = "/sbin/ping"
let arguments = ["-c", "1", "-W", "3", "\(IP)"]
let (output, error, status) = try Processes().DoTask(command: command, args: arguments)
return (output, error, status)
}
Я вызываю эту функцию при нажатии кнопки поиска в приложении следующим образом (она извлекает данные из примерно 4 различных REST API и использует эти данные для делать разные вещи)
let IPs = ["\(self.AdbDict["eth0Ip"]!)", "\(self.AdbDict["lomIp"]!)", "\(self.AdbDict["vmIp"]!)"]
var count = 0
for IP in IPs {
let (res, err, stat) = try PingCheck(IP: IP)
self.pingResult[count]!["Result"] = res
self.pingResult[count]!["error"] = err
self.pingResult[count]!["status"] = stat
count += 1
}
в качестве примечания, я исхожу из Python, после борьбы за объединение моего приложения, которое было построено в python, с pyGTK для gui (которое я переместил в from python и tkinter для gui), который не будет работать из-за жестких требований среды выполнения, даже со всеми необходимыми правами .... Мне надоело копаться в сложных проблемах с библиотеками python, поэтому я сдался и решил создать swift ... так что я буквально только начал использовать swift через пару недель go, большая часть моего интерфейса завершена, и все мои вызовы API работают нормально, Мне нужно знать, пингуются ли эти IP-адреса после их обнаружения, чтобы приложение знало, может ли оно попытаться сделать с ними что-то другое или сообщить пользователю, что они недоступны. Я пробовал PlainPing, но безуспешно, если IP недоступен. PlainPing переходит к следующему, если он достижим, он останавливается в той же точке ... Я пробовал SwiftPing, но получил ошибку компиляции после добавления его в свой файл pod. поэтому я вернулся к Process, так как SimplePing, похоже, не делает то, что я хочу (я хочу отправить 1 пакет на IP, и если я получу ответ, отлично, если нет, сообщите пользователю, что IP не отвечает на ping)
я также использую Swifty JSON в этой, Sparkle update framework, et c et c, поэтому я сомневаюсь, что это имеет какое-либо отношение к проблеме, с которой я столкнулся, но ... Я отвлекся ...