7

我有以下代码用于发现网络上的服务:

[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

4

2 回答 2

0

It seems to be a limitation of the Airport Express.

My current implementation with GCDAsyncSocket works pretty well and I just have to make sure that only one socket is used to communicate with the Airport Express.

I'm closing the question.

于 2012-08-01T02:29:03.533 回答
0

我确信它在 Lion 中不再为 NSStreamEventEndEncountered 事件调用处理程序。因此,当您确定已收到所有数据时,您需要关闭输入流并将其从循环中删除。例如当 NSStreamEventHasBytesAvailable 发生时。检查一下,我想它应该可以工作

于 2011-12-01T12:47:02.483 回答