2012-03-17 10 views
1

私はゆっくりとネットワーク用のコードを学習していますが、行き詰まっています。私はNASドライブのTXTレコードにアクセスすることで、で説明として提供:iOSでTXTレコードを読む

http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt

しかし、私はこのコードを実行すると:

browse = [[NSNetServiceBrowser alloc]init]; 
[browse setDelegate:self]; 
[browse searchForServicesOfType:@"_afpovertcp._tcp." inDomain:@"local"]; 

はsevicesの検索を設定するには、コールバックのために、以下:

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing 
{ 
    NSLog(@"Found: %@",aNetService); 
    CFNetServiceRef aCFNetRef; 
    aCFNetRef = CFNetServiceCreate(kCFAllocatorDefault, (__bridge CFStringRef)[aNetService domain],(__bridge CFStringRef) [aNetService type], (__bridge CFStringRef)[aNetService name], 0); 
    CFStreamError error; 
    if (CFNetServiceResolveWithTimeout(aCFNetRef, timeOut, &error)) { 
     NSLog(@"CFNET TXT: %@",CFNetServiceGetTXTData(aCFNetRef)); 
     } 
    } 
    NSLog(@"TXTRecord: %@",[NSNetService dictionaryFromTXTRecordData:[aNetService TXTRecordData]]);  
    if (!moreComing) { 
     [browse stop]; 
     [refreshButton setEnabled:YES]; 
     [self reloadInputViews]; 
    } 
} 

nslog()行が見つかったサービスのTXTレコードのが空であることを示しています。私は

Found: <NSNetService 0x6a90fd0> local. _afpovertcp._tcp. myLocalSVR 
CFNET TXT: <00> 
TXTRecord: (null) 

の線に沿って何かを得る誰かが私はコードの権利を持っているか、それだけということであるかどうかを言うことができますここのローカルNASはTXTレコードを含んでいません - 私が読んだものから、これはちょうどそうではありません。私はまた、TXTレコードが急上昇する前にサービスを解決する必要があることを読んだが、それはCFNetServiceResolveWithTimeout()がやっていることを期待していた。

ありがとう!

Todd。

+0

NASがmDNS経由で自ら発表することを確認しましたか?ターミナルから、コマンドで試しているものと同等のクエリを実行することができます:dns-sd -B _afpovertcp._tcp local – itorres

+0

ありがとう、私はあとでそれを実行します。 – Todd

答えて

1

あなたは(http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt)にリンク文書、重点鉱山から:

DNS-SD TXTレコードの意図は、サービスに関する 有用な追加の少量の情報を伝えることです。理想的には、
というクライアントがサービスへの接続を有効に確立する前に、クライアントがこの追加情報を取得する必要があるのは、
である必要はありません。 うまく設計されたアプリケーションプロトコルの場合、何の情報
は、TXTレコードに全く存在しない場合でも、それは
と通信するために、使用されているだけ
ホスト名、ポート番号、およびプロトコルを知って、可能であるべきです
サービスインスタンス
のさらなるオプションまたは機能を決定するためのバージョンまたは機能のネゴシエーションを実行します。 TCP上アップルファイリング
プロトコル(AFP)[AFP]サーバに接続するとき、例えば、クライアントは、AFP
のバージョンサーバーが実装、およびオプション機能を決定するために、サーバと
プロトコル交換に入りますまたは機能
(存在する場合)が利用可能です。

私は、共有をリストするために、発見されたサーバとのAFPセッションを確立することを適切に行うことを理解します。

あなたはdns-sd -LとNASのTXTレコードを確認することができます。

dns-sd -L name type domain
を見上げると命名サービスに連絡して使用するために必要な情報を表示します。そのサービスが利用可能なマシンのホスト名を サービスがリッスンしているポート番号、および(存在する場合)TXTレコードの属性を示しています。私のローカルネットワーク上の_afpovertcpクエリを行う

私が取得:

$ dns-sd -L mir _afpovertcp._tcp. local. 
Lookup mir._afpovertcp._tcp..local. 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 4) Flags: 1 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 5) Flags: 1 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 9) Flags: 1 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 10) Flags: 1 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 11) Flags: 1 
1:14:40.948 mir._afpovertcp._tcp.local. can be reached at mir.local.:548 (interface 12) 

・ホープ、このことができますし。

+0

ありがとうitorres。私のターミナルウィンドウでも同様のことが起こります。あなたの投稿は、私が基本的な力学を理解するのに役立ちます。私は、サービスに接続してやりとりする方法を探し続ける必要があります。私はサービスに接続して質問することができる素晴らしいobj-cライブラリを期待するにはあまりにも楽観的だったと思います!私は疑う余裕のない苦闘の多くになるだろう。 – Todd

0

これは古い質問ですが、これを自分で処理しました。

TXTRecordDataは、netServiceDidResolveAddressが呼び出されるまで利用できません。 例:

- (void)netServiceDidResolveAddress:(NSNetService *)service { 

    NSData* data = [service TXTRecordData]; 
    NSDictionary* dict = [NSNetService dictionaryFromTXTRecordData:data]; 

あなたはdidFindServiceポイントでチェックされているが、アドレスが解決される前に、すべての呼び出しは、nilを返します。

+0

マットありがとう。それは古いですが、私はそれを持ってどこにも行かなかったので、プロジェクトを復活させるのに良いでしょう。 – Todd

+0

- (void)netServiceDidResolveAddress:(NSNetService *)送信者で結果を取得しましたが、リモートマシン上で利用可能な機能を調べる方法はまだ分かりません。 TXTレコードは "<00>"と表示されます。 – Todd

+0

したがって、上記のようにnetServiceDidResolveAddressの辞書に記入すると、辞書に "<00>"が表示されますか?または空の辞書ですか?私の場合、AirPrintの場合、私の辞書に25以上のエントリがあります。 –