У меня проблема с использованием GCD. Я хочу сканировать некоторые порты на IP-адресе с помощью iPhone, я пытался использовать GCDAsyncSocket. Я хочу хранить подключенные порты, используя массив, который определен как глобальная переменная. Вот код для этого:
import UIKit
class PortStatusViewController: UIViewController, GCDAsyncSocketDelegate {
var device: MMDevice!
private var connectedPorts = [UInt16]()
private var allTestPorts: [UInt16] = [
21, 22, 23, 25,
53, 80, 110, 115,
135, 139, 143, 194,
443, 445, 1433, 1521,
3306, 3389, 5632, 5900,
8080, 9200, 10000, 22122
]
private var isConnected: Bool = false
private var index = 0
private var socket: GCDAsyncSocket!
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Port Status"
//Scan the port
for i in 0..<self.allTestPorts.count {
self.connectToHost(ipAddress: self.device.ipAddress, onPort: self.allTestPorts[i])
self.index += 1
}
print(self.connectedPorts)
print(self.index)
//Add the label on screen
if self.index == self.allTestPorts.count {
for i in 0..<self.allTestPorts.count {
if self.connectedPorts.contains(self.allTestPorts[i]) {
self.isConnected = true
}
DispatchQueue.main.async {
self.addLabel(with: self.isConnected, andIndex: i) //Add label to the view to indicate the port's status
}
self.isConnected = false
}
}
print(self.device.ipAddress!)
}
func connectToHost(ipAddress: String, onPort port: UInt16) {
do {
socket = GCDAsyncSocket(delegate: (self as GCDAsyncSocketDelegate), delegateQueue: DispatchQueue.main)
if socket.isDisconnected == false {
self.socket.disconnect()
}
try socket.connect(toHost: ipAddress, onPort: port, withTimeout: 1)
} catch {
print("Error connected to host on port: \(error)")
}
}
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
print("Connected")
sock.readData(withTimeout: 1, tag: 0)
self.connectedPorts.append(port)
print(port)
print(self.connectedPorts)
}
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
print("Disconnected")
}
Каждый раз, когда я запускаю приложение и распечатываю журнал, connectPorts всегда печатаются до завершения теста порта, я пытаюсь использовать барьер потока, чтобы сначала выполнить сканирование, но это все еще не работало, подключенный массив мог печатать в сокете, но не в основном потоке. Может ли кто-нибудь помочь указать, какую часть я сделал неправильно? Или, может быть, это не лучший способ сохранить результат?