問題タブ [nsnetservice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
316 参照

ios - NSNetService/NSStream に接続しているクライアントを一意に識別します

クライアント アプリとサーバー アプリの間で 2 つの NSStreams ペア (入力/出力) を開いています。これら 2 つのストリームを同じサーバー側オブジェクトに関連付ける必要があります。2 ストリーム アプローチは、didAcceptConnectionWithInputStream が 2 回呼び出されることを意味します。クライアントからの各ストリーム オープン コマンドに対して 1 回です。両方の open コマンドは、一方が他方の直後に順次実行されます。2 つのオープンが連携してサーバー側でペアリングされることを利用してみましたが、2 つの異なるクライアントが同時に接続しようとすると、競合状態とストリームの混乱の問題が確実にあります。

サービスに接続するときに送信できるキーと値のペアがあれば完璧で、クライアントを識別するためにクライアント生成の GUID を送信できます。

IP アドレスによる識別は、クライアントがローカル ネットワーク上にある (NAT をトラバースする必要がない) ため可能な解決策ですが、NSNetService で実装するのは複雑に思えます。

0 投票する
1 に答える
310 参照

ios - Bonjourサービスの状態を知る

NSNetServiceNSNetServiceBrowserを使用して、ネットワーク上の Bonjour サービスを公開およびスキャンしています。実装は正常に機能しており、サービスはネットワーク上で検出され、通信可能です。私は現在、フレームワークのライフサイクルとこれまでに得たものを理解しようとしています:

これは、アダプターをオンにしてサービスを開始すると発生します。ここで、サービスがネットワーク上でアクティブにアドバタイズされているかどうかを常に把握する必要があります。つまり、他のデバイスがそれを見つけることができるかどうかです。そこで、Wi-Fi アダプターをオフにしてテストします。

次に、アダプターをオンに戻します。

問題は、アダプターのオンとオフの違いがまったくないため、パターンを探すことができないことです。これらのイベントをキャッチできる他の方法はありますか?

編集:最悪になります。両方のアダプターをオフ (機内モード) にしてサービスを開始しても、netServiceDidPublish:が呼び出されます。これまでのところ、netServiceDidNotPublish:は、同じサービスを 2 回登録しようとしたときにのみ呼び出されるようです。これは私にとって非常に直感的ではありません。サービスがネットワークではなくアダプターに公開された可能性があるため、これらのコールバックは非常に誤解を招く可能性があります。この時点で、サービスがネットワーク上で表示されているかどうかを知る方法はありません。

0 投票する
0 に答える
126 参照

ios - NSNetServiceBrowser が「ときどき」Apple TV を検出できない

過接続NSNetServiceBrowserを見つけるためNSNetServiceに使用しています。今、私のコードはほぼ毎回動作します。しかし、たまに (10 回に 1 回)見つけられないか、見つけるのに非常に時間がかかります。Apple TVbonjourNSNetServiceBrowserNSNetServiceApple TV

NSNetServiceBrowserが を検出できなくなったらApple TV、 を再起動する必要がApple TVあり、再びすべてが正常に機能し始めます。

何が問題なのか、再起動するとどのようにApple TV解決するのか理解できません。そのため、問題を特定するためのガイダンスや提案を探しています。

Apple TV のコード:

iOS デバイスのコード:

更新: 2 つの iOS デバイス間の接続を試みても、決して起こりません。その場合、100/100回接続できます。しかし、Apple TV を導入するとすぐに、テレビが見つからない機会が増え始めます。

0 投票する
1 に答える
361 参照

swift - 迅速な NSNetService クラスで getInoutStream を使用してデータを送信する方法

現在、NSNetService クラスを使用して 2 つの IOS デバイスを接続するプログラムに取り組んでいます。両方のデバイスを接続できますが、getInoutStream 関数を使用してデータを送信する方法がわかりません。どんな仲間でも私を助けることができますか?

0 投票する
0 に答える
467 参照

ios - NSNetService の includePeerToPeer 設定による CocoaAsyncSocket および True iOS ピアツーピア ファイル転送

私が「真の」ピアツーピアネットワークと呼ぶもの、つまり中間ルーター/ Wi- fi ネットワーク。私は、次の 3 つの高レベルのオプションがあると判断しました。

1) Apple の Multipeer Connectivity ライブラリ。近くにある他のデバイスの検出を可能にし、Apple が「リソース」と呼んでいるファイルを送信する機能も備えています。これを使ってプロトタイプを作成したところ、このフレームワークは大きなファイル (200 MB 以上) を送信するのが苦手であることがわかりました。速度が 200KB/s を超えることはめったになく、信頼性がありませんでした。私がこれまでに見たこのフレームワークの最速は、約 1 MB/秒でした。他の人の経験は、私がオンラインで見たものから私のものを反映しているようです.

2)簡単にグラブしてsNSNetServiceする機能に加えて、 のディスカバリー サービス。これをプロパティと組み合わせて使用​​すると、「真の」ピアツーピア方式でデバイスに簡単かつ迅速に接続し、これらのストリームを使用してネットワーク経由でデータを送信できます。これはすばらしいことですが、ヘッダー データ (着信ファイル名、サイズ、場所など) をストリームにパックする必要があるため、入力ストリームと出力ストリームの処理は非常に複雑です。これは実際に機能していますが、実装に不安があり、すべてのベースをカバーできる方法がないように感じています。ある意味で、私はここで車輪を再発明しているように感じます.NSInputStreamNSOutputStreamNSNetServices includePeerToPeer

3) 私の理想的な解決策NSNetServiceは、最後の解決策と同様にピアを検出して接続する の機能を使用CocoaAsyncSocketsしますが、実際のファイル転送を処理するために実装することで、実績のある確立されたライブラリを使用できるようになり、逃げることもできます。使用の核心的な詳細NSInputStreamからNSOutputStream.

ここで私が抱えている問題は、デバイスが同じネットワークに接続されている場合、CocoaAsyncSockets はうまく機能しますが、真のピア ツー ピア ネットワークでは相互に接続できないことです。通常のイーサネット インターフェイス。真のピア ツー ピアは Apple の awdl インターフェイスを使用しているようです。これは、開発者フォーラムで読んだもので、通常のインターフェイスのようには使用できません (ソケットを接続するときにそのインターフェイスを指定しようとしましたが、機能しません)。

私はこれがかなり漠然としていることを知っていますが、誰か私に何か提案はありますか? NSNetServiceApple 開発者フォーラムの開発者の 1 人が、を使用してを介して提供されるソケットから独自のソケットを作成することに関する関連トピックについて言及しましたpublishWithOptions:NSNetServiceListenForConnectionsが、彼は多くの情報を提供しておらず、それがどのように機能するかを理解できないようです。 .

0 投票する
4 に答える
6492 参照

ios - Swift 3 NetService IP を解決するには?

Swift 3でBonjourを試してみました

これが私のコードです。デリゲートを受け取ることができます

そして、これが私の結果です

netServiceDidResolveAddress サービス名 Webber の Mac mini タイプ _myapp._tcp.、ポート 5678、アドレス Optional([<1002162e c0a80205 00000000 00000000>, <1c1e162e 00000000 fe800000 00000000 000bce7ad 24b000>800]8)

c0a80205 は私が探している IP です => 192.168.2.5

そして、アドレスは [Data] です、とAppleは言います

サービスのアドレス。これは NSData インスタンスの NSArray であり、それぞれが connect(2) での使用に適した単一の struct sockaddr を含んでいます。サービスのアドレスが解決されていない場合、またはサービスがまだ解決されていない場合は、空の NSArray が返されます。

なぜ Data が .btyes を使用できないのか、まだ混乱していますか? Apple が言うように、「これは NSData インスタンスの NSArray です」しかし、私は NSData のようには使用できません

そして、アドレスを読み取り可能な IP 文字列として解決する方法は?

以前にこれを試しましたが、例外として結果が得られません...

どんな提案も役に立ちます、ありがとう

0 投票する
1 に答える
961 参照

ios - GCDAsyncSocket クライアント/サーバーが iOS アクセス ポイントで動作しない

GCDAsyncSocket (7.5.0) を使用した非常に単純な TCP クライアント/サーバーの実装がありNSNetService、サービス検出に使用しています。これはローカルのwifiネットワークでのみ使用されており、2年間問題なく動作します(私はGCDAsyncSocketを適切に使用しています)。

...クライアントとサーバーが接続する Wi-Fi ネットワークを提供するアクセス ポイントとして 3 番目の iOS デバイスを使用するまでは。

3 番目の iOS デバイスが Bluetooth 経由で接続を共有することにより、クライアントとサーバーの両方に接続する場合も同様です。

サービスの検出は問題ありませんが、IP アドレスとポートを取得すると、接続できず、次のエラーが発生します。

Error Domain=NSPOSIXErrorDomain Code=64 "Host is down" UserInfo={NSLocalizedDescription=Host is down, NSLocalizedFailureReason=Error in connect() function}

IPv4 と IPv6 に制限してみました (どちらもサービス ディスカバリーによって提供されます)。また、GCDAsyncSocket リポジトリの ipv6 git ブランチとさまざまなパラメーターを使用してみました。

私の主な質問は次のとおりです。Wi-FiまたはBluetooth iOSアクセスポイントを介して単純なTCP接続を確立できますか?

NSNetService2 つ目の質問は、単純な TCP 接続ではなく、サービス検出が機能するのはなぜですか? プロトコルが比較できないことはわかっていますが、それでも混乱します。