我能够使用 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/