我有以下代码用于发现网络上的服务:
[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事件,我该如何防止这种情况的发生?
更多信息:https://devforums.apple.com/message/541436
我确信它的In Lion处理程序不再为nsstreameventendresolved事件调用。因此,您需要关闭输入流,并在确定已接收到所有数据时将其从循环中删除。例如当NSStreamEventHasBytesAvailable发生时。检查一下,我想它应该可以工作
这似乎是机场快线的限制。
我目前使用GCDAsyncSocket的实现工作得很好,我只需要确保只有一个套接字用于与机场快线通信。
我要结束这个问题