2014-10-21 3 views
3

Я хочу проверить записи TXT для своего сервера из своего собственного приложения.Как получить запись DNS TXT в приложении iOS

Возможно ли это? Если да, как это можно сделать?

Спасибо!

+1

Да, на втором чтении, это, вероятно, не самый важный вопрос. – mattt

+0

@mattt, спасибо за AFNetwotking :) –

ответ

6

Вот что-то, что я сбросил несколько быстро. Я не очень хорошо знаком с TXT-записями, поэтому вы можете протестировать его несколькими сценариями, но это демонстрирует основную концепцию. Вы можете изменить его, чтобы вернуть значения TTL, если вам нужно. Вы хотите добавить -lresolv к своим флагам компоновщика и импортировать заголовки resolv.h.

#include <resolv.h> 

static NSArray *fetchTXTRecords(NSString *domain) 
{ 
    // declare buffers/return array 
    NSMutableArray *answers = [NSMutableArray new]; 
    u_char answer[1024]; 
    ns_msg msg; 
    ns_rr rr; 

    // initialize resolver 
    res_init(); 

    // send query. res_query returns the length of the answer, or -1 if the query failed 
    int rlen = res_query([domain cStringUsingEncoding:NSUTF8StringEncoding], ns_c_in, ns_t_txt, answer, sizeof(answer)); 

    if(rlen == -1) 
    { 
     return nil; 
    } 

    // parse the entire message 
    if(ns_initparse(answer, rlen, &msg) < 0) 
    { 
     return nil; 
    } 

    // get the number of messages returned 
    int rrmax = rrmax = ns_msg_count(msg, ns_s_an); 

    // iterate over each message 
    for(int i = 0; i < rrmax; i++) 
    { 
     // parse the answer section of the message 
     if(ns_parserr(&msg, ns_s_an, i, &rr)) 
     { 
      return nil; 
     } 

     // obtain the record data 
     const u_char *rd = ns_rr_rdata(rr); 

     // the first byte is the length of the data 
     size_t length = rd[0]; 

     // create and save a string from the C string 
     NSString *record = [[NSString alloc] initWithBytes:(rd + 1) length:length encoding:NSUTF8StringEncoding]; 
     [answers addObject:record]; 
    } 

    return answers; 
} 

Использование довольно прямо вперед:

NSArray *records = fetchTXTRecords(@"google.com"); 
NSLog(@"%@", records); 

// outputs: 
// (
//  "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all" 
//) 
+1

@ AndrosovMichil Если вам нужно его изменить, вы можете найти более сложный пример на https://gist.github.com/wil/6141275. Это то, на чем я основал большую часть этого ответа. –

+0

NB: запись 'TXT' может содержать несколько' 'последовательностей внутри нее. Все они должны быть найдены и объединены вместе. – Alnitak

Смежные вопросы