Zyp*_*rax 7 bonjour objective-c stream nsnetservice nsnetservicebrowser
我有以下代码用于发现网络上的服务:
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
Run Code Online (Sandbox Code Playgroud)
这导致调用这两种方法(查找服务和删除服务):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
Run Code Online (Sandbox Code Playgroud)
这很好用.当我关闭设备时,我立即收到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];
Run Code Online (Sandbox Code Playgroud)
它突然需要NSNetServiceBrowser几乎一分钟来检测我关闭了设备
(调用didRemoveService需要一分钟).
我没有与之通信的设备(打开流)仍然会在我删除它们后立即调用didRemoveService.
更新: 这里有一些与我的问题相关的信息.
我跟Wireshark跑了一段路,注意到以下几点:
我在iPad模拟器中启动应用程序,应用程序启动NSNetServiceBrowser并检测打印机.之后,它打开输入/输出流到设备(通过机场快递,USB).打印机正在向我发送状态更新,当我点击应用程序中的测试按钮时,打印机开始打印.在Wireshark中,我看到了与打印机的所有通信.
现在,当我在iPad上启动完全相同的应用程序(并让iPad模拟器运行).应用程序也启动NSNetServiceBrowser,并检测打印机.打印机没有向我发送状态更新,当我点击测试按钮时,打印机没有打印.在Wireshark中,我看到了沟通.打印机或机场接收我的命令并发送ACK包.
一旦我杀死iPad模拟器应用程序,打印机就会开始打印我使用iPad发送的命令.似乎打开一个套接字阻止所有的bonjour事件,我怎么能防止这种情况发生?
| 归档时间: |
|
| 查看次数: |
1366 次 |
| 最近记录: |