我有以下代码来发现网络上的服务:
[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事件,我如何防止这种情况发生?
发布于 2012-08-01 02:29:03
这似乎是机场快线的一个限制。
我目前使用GCDAsyncSocket的实现工作得很好,我只需要确保只使用一个套接字来与Airport通信。
我要结束这个问题。
发布于 2011-12-01 12:47:02
我确信它在Lion中不再为NSStreamEventEndEncountered事件调用处理程序。因此,当您确定收到所有数据时,您需要关闭输入流并从循环中删除它。例如,当NSStreamEventHasBytesAvailable发生时。看看它,我想它应该能用。
https://stackoverflow.com/questions/7161867
复制相似问题