7

ネットワーク上のサービスを検出するための次のコードがあります。

[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イベントがブロックされるようですが、どうすればこれを防ぐことができますか?

詳細はこちら:https ://devforums.apple.com/message/541436

4

2 に答える 2

0

そのInLionでは、NSStreamEventEndEncounteredイベントのハンドラーが呼び出されなくなったと確信しています。したがって、すべてのデータを受信したことを確認したら、入力ストリームを閉じてループから削除する必要があります。たとえば、NSStreamEventHasBytesAvailableが発生した場合です。それをチェックしてください、そして私はそれがうまくいくはずだと思います

于 2011-12-01T12:47:02.483 に答える
0

AirportExpressの制限のようです。

GCDAsyncSocketを使用した現在の実装は非常にうまく機能しており、AirportExpressとの通信に使用されるソケットが1つだけであることを確認する必要があります。

質問を締めくくります。

于 2012-08-01T02:29:03.533 に答える