iOS 卓悦 : didFindService but failed to resolve in public Wi-Fi network

标签 ios bonjour

我能够使用 NSNetServiceBrowser 在本地 wi-fi 中查找并解析 mDNS 服务。但在公共(public)Wi-Fi网络中,相同的代码只能找到服务,而无法解析服务。

即以下委托(delegate)回调成功:

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
           didFindService:(NSNetService *)aNetService
               moreComing:(BOOL)moreComing

但是永远不会调用以下回调:

- (void)netServiceDidResolveAddress:(NSNetService *)sender

取而代之的是:

- (void)netService:(NSNetService *)sender
didNotResolve:(NSDictionary<NSString *,NSNumber *> *)errorDict

errorDict 是:

{
    NSNetServicesErrorCode = "-72007";  // timeout
    NSNetServicesErrorDomain = 10;
}

为了调试,我使用 WireShark 捕获 UDP 数据包,发现有一个 mDNS 响应数据包具有包含主机 IP 和端口的 SRV 记录。

我的问题是:iOS Bonjour 到底在底层解析什么服务?为什么在查找服务时没有透露更多信息? (在公共(public) Wi-Fi 网络中有何不同?)

iOS 版本:12 和 13

最佳答案

大多数公共(public) WiFi 网络实现客户端隔离;它们允许您的设备与 Internet 通信,但不能与同一 wifi 网络上的其他设备通信。

这是为了防止网络上的某人对可能存在漏洞的其他设备发起攻击,这些漏洞通常可以通过防火墙缓解,但会暴露给同一局域网上的设备。

该服务可以被发现,因为多播数据包被转发到所有设备(多播,就像广播不针对特定设备)。

但是,连接到服务所需的单播数据包被定向到特定设备,因此被阻止。

在典型的客户端隔离实现中,网络会阻止 ARP 请求,这就是您收到无法解析服务地址的错误的原因。就好像网络上根本不存在具有所需 IP 地址的设备一样。

关于iOS 卓悦 : didFindService but failed to resolve in public Wi-Fi network,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844348/

相关文章:

iOS,如何禁用有关已弃用方法的某些警告

ios - 在 iOS 中获取本地网络主机名

c - bonjour 如何发现网络上的设备?

Ruby DNSSD Bonjour IP 地址发现

ios - 将 NSDate 转换为 NSString 以保存在 NSMutableArray 中

objective-c - 在按钮 B 的 TouchDown 期间触发 Button A 的 TouchDown

iphone - 在室内可靠地定位 iPhone?

delphi - 可以用Delphi XE5创建zeroconf服务吗?

ios - 使用 alamofire 下载不完整的文件

ios - Segue 动画不能完全正常工作