在我的局域网中,我在 6 台 MAC 计算机上运行以下终端命令来托管一个文件夹,其中discover.xml
:
python -m SimpleHTTPServer 17171
在我的应用程序Alamofire
安装后,我运行此代码以获取discover.xml
内容:
extension String {
func url(file: String) -> URL {
return URL(string: "http://\(self)/\(file)?rand=\(arc4random())")! // `rand` to make sure no cached content
}
}
func discover(from ip: String, completion: @escaping () -> Void) {
let url = ip.url(file: "discover.xml") // ip passed in: "192.168.1.15:17171" for ex
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.timeoutInterval = 6.0 // !
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 6.0
manager.session.configuration.timeoutIntervalForResource = 6.0
manager.request(request).responseData { (response) in
switch response.result {
case .success(let d):
// do my stuff on `multiX`
case .failure(let error):
print("failed with IP: \(ip) => \(error)")
}
}
}
以下是我的发现方式:
private func discover(on subnet: String) { // subnet: 192.168.1
let group = DispatchGroup()
for i in 1..<256 {
let ip = subnet + ".\(i):17171"
group.enter()
discover(from: ip) {
group.leave()
}
}
group.notify(queue: DispatchQueue.main) { [weak self] in
guard let strongSelf = self else { return }
print("all done: \(strongSelf.multiX.count)") // just can discover 2, or 3, or 4 !!
strongSelf.tableView.reloadData()
}
}
为什么大多数时候,我无法discover.xml
从 6 台 MAC 计算机中获取 6 个?(我只能得到 2 个或 3 个或 4 个)。我得到的结果不是持久的。假设我有 6 台 MAC 计算机正在运行python -m ...
,命名为:A、B、C、D、E、F。有时我只能得到:A、B、D,有时是 C、F、...
请求剩余的主机discover.xml
总是有错误的计算机failed with IP: x.x.x.x:17171 => Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
(我确定那些丢失的计算机已经成功获取了IP)
可以使用我上面的方法发现整个子网吗?(即使用for循环迭代每个ip)。6 秒是合理的超时时间吗?
编辑:
我试图让所有人都在 ATS 中,但情况并没有好转
实际上是什么阻止了我discover.xml
在 MAC 计算机上请求?
谢谢,