2012-03-17 62 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"]; 

要爲服務隊的搜索和回調如下:

-(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()正在做的事情......

謝謝!

託德。

+0

您是否檢查過NAS是通過mDNS宣佈的?您可以從終端執行與使用該命令嘗試的同等查詢:dns-sd -B _afpovertcp._tcp local – itorres 2012-03-17 23:59:18

+0

謝謝,我稍後再說。 – Todd 2012-03-20 10:42:19

回答

1

從您鏈接到(http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt)的文件,重點煤礦:

的DNS-SD TXT記錄的目的是要傳達的有關服務 有用的附加信息的量小。理想情況下,在客戶端可以有效建立與服務的連接之前,客戶端不應該需要
來檢索此附加信息
對於 精心設計的應用協議,即使沒有信息
在所有在上班時間記錄,它應該是可能的,只知道
主機名稱,端口號,和正在使用的協議,與
通信 表示監聽過程,然後執行版本或功能
協商以確定
服務實例
的任何其他選項或功能。例如,當客戶端通過TCP連接到Apple協議(AFP)[AFP]服務器時,與服務器進行協議交換以確定服務器實現哪個AFP版本,以及哪些可選功能或能力
(如果有)可用。

據我所知,正確的做法是與發現的服務器建立AFP會話以列出共享。

您可以檢查NAS的TXT記錄與dns-sd -L

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 2012-03-18 08:58:30

0

我知道這是一個老問題,但只是自己解決了這個問題。

在調用netServiceDidResolveAddress之前,TXTRecordData不可用。 如:

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

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

您在didFindService點檢查,但該地址之前的任何呼叫解決將返回零。

+0

謝謝馬特。這是舊的,但我沒有得到它的任何地方,所以這將是很好的復活項目。 – Todd 2015-05-26 11:00:46

+0

所以我用 - (void)netServiceDidResolveAddress:(NSNetService *)發送器得到了一個結果,但是我仍然不清楚如何去查詢遠程機器上的可用功能。 TXT記錄仍顯示爲「<00>」。 – Todd 2015-05-26 20:55:56

+0

那麼,當你填寫上面添加的netServiceDidResolveAddress中的字典時,你的字典中會出現「<00>」?還是空的字典?就我而言,對於AirPrint,我的字典中有25個左右的條目。 – 2015-05-27 13:49:36