我有以下代码用于发现网络上的服务:
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
这导致调用这两种方法(查找服务和删除服务):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
这工作正常。当我关闭设备时,我立即收到didRemoveService呼叫。
但是,当我打开设备的流(输入、输出或两者)时:
[netService getInputStream: &inputStream outputStream: &outputStream];
[inputStream setDelegate: self];
[outputStream setDelegate: self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode: NSDefaultRunLoopMode];
[inputStream open];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outputStream open];
NSNetServiceBrowser 突然花了将近一分钟的时间检测到我关闭了设备(调用didRemoveService
需要一分钟)。
一旦我删除它们,我不与之通信(打开流)的设备仍然会调用didRemoveService 。
更新: 这是与我的问题相关的更多信息。
我使用 Wireshark 进行了跟踪,并注意到以下内容:
我在 iPad 模拟器中启动我的应用程序,该应用程序启动 NSNetServiceBrowser 并检测打印机。之后,它打开设备的输入/输出流(通过机场快线、usb)。打印机正在向我发送状态更新,当我点击应用程序中的测试按钮时,打印机开始打印。在 Wireshark 中,我按预期看到了与打印机的所有通信。
现在,当我在 iPad 上启动完全相同的应用程序(并让 iPad 模拟器运行)时。该应用程序也会启动 NSNetServiceBrowser,并检测打印机。打印机没有向我发送状态更新,当我点击测试按钮时,打印机没有打印。在 Wireshark 中,我看到了通信。打印机或机场收到我的命令并发送一个 ACK 包。
一旦我杀死 iPad 模拟器应用程序,打印机就会开始打印我使用 iPad 发送的命令。似乎打开一个套接字会阻止所有 bonjour 事件,我该如何防止这种情况发生?