ネットワーク上のサービスを検出するための次のコードがあります。
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
その結果、次の2つのメソッド(サービスの検索とサービスの削除)が呼び出されます。
- (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がデバイスの電源を切ったことを検出するのに突然1分近くかかります( didRemoveService
が呼び出される
のに1分かかります)。
通信していない(ストリームを開いている)デバイスは、削除するとすぐにdidRemoveServiceを呼び出します。
更新: これが私の問題に関連するもう少しの情報です。
Wiresharkでトレースを実行したところ、次のことに気づきました。
iPadシミュレーターでアプリケーションを起動すると、アプリケーションがNSNetServiceBrowserを起動し、プリンターを検出します。その後、デバイスへの入力/出力ストリームを開きます(Airport Express、USB経由)。プリンターからステータスの更新が送信され、アプリのテストボタンをタップするとプリンターが印刷を開始します。Wiresharkでは、期待どおりにプリンタとのすべての通信が表示されます。
これで、iPadでまったく同じアプリケーションを起動したとき(そしてiPadシミュレーターを実行したままにしたとき)。アプリケーションはNSNetServiceBrowserも起動し、プリンターを検出します。プリンターからステータスの更新が送信されず、テストボタンをタップしてもプリンターが印刷されません。Wiresharkで通信が表示されます。プリンターまたは空港が私のコマンドを受信し、ACKパッケージを送信します。
iPadシミュレーターアプリを終了するとすぐに、プリンターはiPadを使用して送信したコマンドの印刷を開始します。ソケットを開くとすべてのbonjourイベントがブロックされるようですが、どうすればこれを防ぐことができますか?