【问题标题】:optimized way to search a device ip address within a range in iphone在 iphone 范围内搜索设备 IP 地址的优化方法
【发布时间】:2015-11-28 04:54:24
【问题描述】:

我有一种情况,我必须搜索 **router ** 的 IP 地址,我只知道它的范围是从 163.289.2.0 到 163.289.2.255。 我知道这不是搜索的好方法。

for i in 1... 255 {

var str = "163.289.2." + "i"
var tempIP = Ping.getIPAddress(str)

if(tempIP == true)
{
   break;
}

}

现在我的问题是我的自定义类 Ping.getIPAddress() 需要 3 秒才能获得给定 IP 值的结果。因此,对于 255 次搜索,大约需要 765 秒(12.75 分钟)。我有限制,搜索应该在最多 2 分钟内完成。那么无论如何我可以使用 swift 在 iPhone 中实现这一点。

我必须只使用这个自定义函数 Ping.getIPAddress() 如果给定的 IP 地址存在则返回 true,否则返回 false。

请提供解决此问题的示例或参考或方法。

使用 NSOperationQueue 并将 MaxConcurrentOperationCount 设置为 10 会很好吗?

【问题讨论】:

  • Ping.getIPAddress() 到底是什么?它似乎是同步的,但您可以同时进行各种后台调用。
  • @Larme - 此函数将查找给定的 IP 地址。如果存在则返回 true,如果不存在则返回 false。
  • 你的for loop应该从0开始,而不是1
  • 首先你使用的地址是非法的。 289 不是有效的 IP 条目。必须小于 255。此路由器是您连接的主路由器吗?如果是这样,那么它可能是您设备的默认网关,所以只需查找一下?此外,如果您是该网络的一部分,您只需向网络广播地址发送一个 ping,然后等待查看谁回复。
  • @appzYourLife 从 0 开始对于从 0.1 开始的 IP 地址是不正确的。它应该停在 254 虽然 255 将是网络广播地址 8^)。

标签: ios iphone algorithm swift search


【解决方案1】:

同步方法

如果我们只在前一个调用完成后对Ping.getIPAddress(str) 进行调用,当然我们需要等待 (3 seconds * 256) = 768 seconds。

异步方法

另一方面,我们可以对Ping.getIPAddress(str) 执行多个并发调用。

伪 Ping 类

这是我为测试你的功能而创建的一个类。

class Ping {
    class func getIPAddress(str:String) -> Bool {
        sleep(3)
        return str == "163.289.2.255"
    }
}

如您所见,该类确实等待 3 秒(模拟您的场景),然后仅当传递的 ip163.289.2.255 时才返回 true。这让我可以复制最坏的情况。

解决方案

这是我准备的课

class QuantumComputer {

    func search(completion:(existingIP:String?) -> ()) {
        var resultFound = false
        var numProcessed = 0
        let serialQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL)
        for i in 0...255 {

            dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_UTILITY.value), 0)) {
                var ip = "163.289.2." + "\(i)"
                let foundThisOne = Ping.getIPAddress(ip)

                dispatch_async(serialQueue) {
                    if !resultFound {
                        resultFound = foundThisOne
                        numProcessed++
                        if resultFound {
                            completion(existingIP:ip)
                        } else if numProcessed == 256 {
                            completion(existingIP: nil)
                        }
                    }
                }
            }
        }
    }
}

该类对Ping.getIPAddress(...) 执行256 次异步调用

256 个异步闭包的结果由以下代码处理:

dispatch_async(serialQueue) {
    if !resultFound {
        resultFound = foundThisOne
        numProcessed++
        if resultFound {
             completion(existingIP:ip)
        } else if numProcessed == 256 {
             completion(existingIP: nil)
        }
    }
}

前一个代码块(从第 2 行到第 9 行)在我的队列 @9​​87654334@ 中执行。这里有 256 个不同的闭包同步运行。

  1. 这对于确保对变量 resultFoundnumProcessed 的一致访问至关重要;
  2. 另一方面,从性能的角度来看,这不是问题,因为这段代码非常快(只是一堆算术运算)

测试

这就是我从标准 ViewController 中调用它的方式。

class ViewController: UIViewController {
    var computer = QuantumComputer()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        debugPrintln(NSDate())
        computer.search { (existingIP) -> () in
            debugPrintln("existingIP: \(existingIP)")
            debugPrintln(NSDate())
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

结论

最后,这是我在 iOS 模拟器上测试时的输出。请提醒这是最坏的情况(因为最后检查的号码是有效 IP)。

2015-09-04 20:56:17 +0000
"existingIP: Optional(\"163.289.2.255\")"
2015-09-04 20:56:29 +0000

只有 12 秒!

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2016-02-04
    • 2013-08-22
    • 2014-12-21
    • 2014-03-04
    • 2017-04-18
    • 2012-11-07
    相关资源
    最近更新 更多