1

我正在慢慢学习为网络编写代码并且已经走到了一个死胡同:我认为通过访问 nas 驱动器的 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()正在做的事情......

谢谢!

托德。

4

2 回答 2

1

从您链接到的文档(http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt),强调我的:

DNS-SD TXT 记录的目的是传达有关服务的少量有用的附加信息。理想情况下,客户端 在可以有效地建立与服务的连接之前,
不需要检索这些附加信息。对于一个设计良好的应用协议,即使 TXT 记录中根本没有任何信息,也应该可以在只知道 主机名、端口号和正在使用的协议的情况下,与 那个监听进程进行通信,然后执行版本或功能 协商以确定 服务实例的任何进一步选项或功能。例如,当连接到 Apple 文件时






协议 (AFP) [AFP] 服务器通过 TCP,客户端进入
与服务器的协议交换,以确定
服务器实现哪个版本的 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)

希望这可以帮助。

于 2012-03-18T00:18:13.100 回答
1

我知道这是一个老问题,但我自己解决了这个问题。

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

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

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

您正在 didFindService 点进行检查,但地址解析之前的任何调用都将返回 nil。

于 2015-05-21T18:33:10.837 回答