4

基本的なクライアント/サーバー相互作用モデルを必要とするiPhoneアプリに取り組んでいます。このために、BonjourとNSNetServiceをNSNetServiceBrowserとともに使用して、同じネットワーク上の他のユーザーを検出します。私は多かれ少なかれ同じサンプルコードを持っているいくつかの異なるガイドに従いました。

関連するサーバーコード

...
serverName = [[UIDevice currentDevice] name];
netService = [[NSNetService alloc] initWithDomain:@"local."
                                             type:@"_myservice._tcp."
                                             name:serverName
                                             port:port];
...

サービスは正常に公開されます。つまり、netServiceDidPublish:コールバックを取得します。

関連するブラウザコード

...
browser = [[NSNetServiceBrowser alloc] init];
[browser setDelegate:delegate];
[browser searchForServicesOfType:@"_myservice._tcp." 
                        inDomain:@"local."];
...

これで、これらすべての結果が興味深いものになります。

  1. iPhoneで実行している場合、デバイスは独自に公開されたNSNetServiceのみを表示できます。
  2. 2台のiPhoneで実行しているため、どちらのデバイスも相手のNSNetServiceを認識できません。
  3. iPhoneシミュレーターで実行すると、独自のNSNetServicesを含むすべてのNSNetServicesが検出されます。

iPhoneシミュレータのスクリーンショット

ここに画像の説明を入力してください

私はここでちょっと途方に暮れています...シミュレーターは正確に期待どおりに動作しています。ただし、そうではないデバイスでは、同じWiFi上で2つの異なるiPhoneを相互に表示することはできず、自分自身のみを表示します。ここで何が起こっているのか分かりますか?

4

1 に答える 1

2

私が使用しているルーターでは、デフォルトで「SPIファイアウォール」が有効になっていることがわかりました。これをオフにすると、問題が解決しました。

私がまだ気になっていることの1つは、iPhoneSimulatorとBonjourBrowserの両方のMacからのリクエストがこのファイアウォールを通過できたのに、3つの異なるiPhoneが通過できなかったのはなぜですか?

于 2012-06-13T22:06:13.013 に答える