Цель-C: DNS-запись TXT

Я безуспешно искал какое-то время, как мне получить запись DNS TXT для домена в Objective-C?

Моя цель - получить тот же результат, что и: dig -t txt google.com +short

PS: Пожалуйста, без NSTask/пиппинга! (Я в настоящее время делаю это, но это плохо). Код можно написать на C, просто позже напишу обертку. Меня не волнуют правила AppStore.

Спасибо!


person TCB13    schedule 26.06.2013    source источник
comment
Не могли бы вы объяснить, что плохого в NSTask/pipping. В настоящее время я использую NSTask для DNS-запросов txt.   -  person sanjeev sharma    schedule 17.02.2015
comment
@sanjeevsharma, пожалуйста, проверьте, что принятый ответ решает вашу проблему. NSTask и пиппинг — это плохо, потому что они вызывают проблемы с безопасностью и, вероятно, не будут приняты в AppStore. Хакеру проще изменить dig на другой двоичный файл и создать собственный ответ DNS или внедрить другие данные в ваше приложение без вашего ведома.   -  person TCB13    schedule 17.02.2015


Ответы (2)


Используйте DNSServiceQueryRecord в dns_sd.h:

#import <dns_sd.h>

// ...

DNSServiceRef serviceRef;

DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT,
                      kDNSServiceClass_IN, queryCallback, NULL);

DNSServiceProcessResult(serviceRef);
DNSServiceRefDeallocate(serviceRef);

// ...

static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
                          DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
                          uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {

    if (errorCode == kDNSServiceErr_NoError && rdlen > 1) {
        NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];

        for (uint16_t i = 1; i < rdlen; i += 256) {
            [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)];
        }

        NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding];
        NSLog(@"%@", theTXT);
    }
}

См. https://developer.apple.com/library/mac/#documentation/Networking/Reference/DNSServiceDiscovery_CRef/Reference/reference.html#//apple_ref/doc/c_ref/DNSServiceQueryRecord

person Danilo    schedule 26.06.2013
comment
Любые советы о том, почему я всегда получаю символ мусора в начале строки? Спасибо. - person TCB13; 27.06.2013
comment
Это байт одной длины, указывающий, что длина TXT находится в диапазоне от 0 до 255. Я обновлю свой ответ, чтобы начать rdata с 1. - person Danilo; 27.06.2013
comment
Я только что понял, что если TXT больше 255 байтов, байт одиночной длины повторяется в theTXT. Я обновлю свой ответ, чтобы принять это во внимание. - person Danilo; 27.06.2013
comment
Почему вы хотите, чтобы это было синхронно? - person Danilo; 27.06.2013
comment
это приложение командной строки, нет причин быть асинхронным. Кроме того, это добавляет больше сложности. - person TCB13; 27.06.2013
comment
Вы можете использовать семафор. См. stackoverflow.com/questions/4326350/ - person Danilo; 27.06.2013
comment
TCB, это ответило на ваш вопрос? Если это так, пожалуйста, отметьте это как таковое. - person Danilo; 28.06.2013
comment
@ Данило, это здорово, спасибо! Один вопрос: когда я запускаю код вашего примера, результаты содержат некоторые странные символы, я ожидал точку (.), я вижу другие символы (например, \x02 , \x03). Я попробовал это с kDNSServiceType_NS, есть идеи, откуда это? Глядя прямо на память (*rdata), все выглядит нормально. - person Roger; 18.12.2013
comment
Я думаю, вы захотите использовать dns_parse_resource_record для анализа rdata. Что бы убрать так называемый мусор. Эта ссылка показывает, как сделать этот анализ для записей SRV. Записи TXT будут использовать аналогичный механизм, но с kDNSServiceType_TXT в качестве типа службы и с использованием txt-части объединения для возврата проанализированных данных. developer.apple.com/library/mac/samplecode/SRVResolver/Listings/ - person Rich Waters; 14.02.2015

можно использовать такой код: удалить \x02 \x03, я удалил \0x12 \0x17, использовать $man ascii check char result[256]={0}; dn_expand(rdata, rdata + rdlen, rdata, результат, 256);

        NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];

        char *p=(char*)rdata;

        for (uint16_t i = 0; i < rdlen; i++) {

            DLog(@"%c\n",*p);
            if (*p > 0x20) {
                [txtData appendBytes:p length:1];


            }
            p++;
        }
person yarshure    schedule 02.07.2014