не разрешать LAN-устройству сканировать порт с помощью GCDAsyncSocket на iPhone - PullRequest
0 голосов
/ 08 марта 2020

У меня проблема с использованием 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 всегда печатаются до завершения теста порта, я пытаюсь использовать барьер потока, чтобы сначала выполнить сканирование, но это все еще не работало, подключенный массив мог печатать в сокете, но не в основном потоке. Может ли кто-нибудь помочь указать, какую часть я сделал неправильно? Или, может быть, это не лучший способ сохранить результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...