Чтение TXT-записи в iOS - PullRequest
       71

Чтение TXT-записи в iOS

1 голос
/ 17 марта 2012

Я постепенно учусь кодировать для сетей и зашел в тупик: я подумал, что, получив доступ к TXT Record диска nas, я смогу увидеть предлагаемые им тома, как описано на:

http://files.dns -sd.org / чернового чеширский-dnsext-ДНС для 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 Record - хотя из того, что я прочитал, однако, это просто не должно иметь место. Я также читал, что служба должна быть разрешена до того, как TXT Record закашлятся, но я надеялся, что это то, что делает CFNetServiceResolveWithTimeout() ...

Спасибо!

Todd.

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Из документа, на который вы ссылаетесь (http://files.dns -sd.org / draft-cheshire-dnsext-dns-sd.txt ), выделение выделено:

Целью записей DNS-SD TXT является передача небольшого количества полезная дополнительная информация об услуге. В идеале это не должно
клиенту необходимо получить эту дополнительную информацию
прежде чем он может с пользой установить соединение с услугой. Для правильно разработанный протокол приложения, даже если нет информации
вообще в записи TXT это должно быть возможно, зная только
имя хоста, номер порта и используемый протокол для связи с
этот процесс прослушивания, а затем выполнить версию- или функцию-
переговоры для определения любых дальнейших вариантов или возможностей
экземпляр службы
. Например, при подключении к Apple Filing
Протокол (AFP) [AFP] сервер по TCP, клиент входит в
протокол обмена с сервером, чтобы определить, какая версия AFP
сервер реализует, и какие дополнительные функции или возможности
(если есть) доступны.

Я понимаю, что для этого нужно установить сеанс AFP с обнаруженным сервером, чтобы получить список общих ресурсов.

Вы можете проверить записи TXT на NAS с помощью 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 голосов
/ 21 мая 2015

Я знаю, что это старый вопрос, но я сам все решил.

TXTRecordData недоступен, пока не будет вызван netServiceDidResolveAddress.Например:

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

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

Вы проверяете в точке didFindService, но любые вызовы до разрешения адреса вернут ноль.

...