DNS-запрос с использованием DNSServiceQueryRecord для kDNSServiceType_MX одна возвращенная запись

Я использую DNSServiceQueryRecord получить kDNSServiceType_MX используя следующее:

DNSServiceQueryRecord(&self->_sdRef,
                      kDNSServiceFlagsReturnIntermediates,
                      0,
                      srvNameCStr, //for example "google.com"
                      kDNSServiceType_MX,
                      kDNSServiceClass_IN,
                      QueryRecordCallback,
                      (__bridge void *)(self)
                      );

и обратный вызов вызывается, но есть только одна запись:

NSMutableData *         rrData;
dns_resource_record_t * rr;
uint8_t                 u8;
uint16_t                u16;
uint32_t                u32;

assert(rdata != NULL);
assert(rdlen < 65536);
rrData = [NSMutableData data];
assert(rrData != nil);

u8 = 0;
[rrData appendBytes:&u8 length:sizeof(u8)];
u16 = htons(kDNSServiceType_MX);
[rrData appendBytes:&u16 length:sizeof(u16)];
u16 = htons(kDNSServiceClass_IN);
[rrData appendBytes:&u16 length:sizeof(u16)];
u32 = htonl(666);
[rrData appendBytes:&u32 length:sizeof(u32)];
u16 = htons(rdlen);
[rrData appendBytes:&u16 length:sizeof(u16)];
[rrData appendBytes:rdata length:rdlen];

rr = dns_parse_resource_record([rrData bytes], (uint32_t) [rrData length]);
assert(rr != NULL);

if (rr != NULL)
{
    NSString *result = nil;
    result = [NSString stringWithCString:rr->data.MX->name encoding:NSASCIIStringEncoding];
    dns_free_resource_record(rr);
}

так что это возвращает только одну запись. Как получить список MX? Что я делаю неправильно? Заранее спасибо!

1 ответ

Решение

Хорошо, я обнаружил, что лучше делать запрос с помощью select(), и результат содержит все MX.

            while (dnsUpdateTimeout > 0)
            {
                FD_ZERO(&readfds);
                FD_SET(dns_sd_fd, &readfds);

                struct timeval tv;
                tv.tv_sec  = (time_t)dnsUpdateTimeout;
                tv.tv_usec = (self.dnsUpdateTimeout - tv.tv_sec) * 1000000;

                result = select(nfds, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv);
                if (result == 1)
                {
                    if (FD_ISSET(dns_sd_fd, &readfds))
                    {
                        err = DNSServiceProcessResult(sdRef); // triggers callback that will process the result
                        if (err != kDNSServiceErr_NoError)
                        {
                            NSLog(@"There was an error reading the DNS SRV records.");
                            break;
                        }
                    }
                }
                NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:startTime];
                dnsUpdateTimeout -= elapsed;
             }
Другие вопросы по тегам