- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在寻找查询 DNS 以在 iOS 中查找 NAPTR 的方法时遇到了很多麻烦。似乎有很多相对简单的方法来解析 IP,但我特别需要在 DNS 查找中找到所有 NAPTR 记录。如果可能的话,我更愿意这样做而不必引入任何外部库。如果有人能够做到这一点(或我可以推断出的类似事情),我将不胜感激。
所有代码都必须在 iOS 5.0+ 中运行
最佳答案
我最终使用了 DNSServiceQueryRecord。
DNSServiceRef sdRef;
DNSServiceQueryRecord(&sdRef, 0, 0,
"google.com",
kDNSServiceType_NAPTR,
kDNSServiceClass_IN,
callback,
NULL);
DNSServiceProcessResult(sdRef);
DNSServiceRefDeallocate(sdRef);
在实际使用中,我发现如果没有结果,应用程序会无限期挂起,所以我最终不得不调整我的代码以在结果上添加超时。
/*
Attempt to fetch the NAPTR from the stored server address. Since iOS will continue waiting
until told directly to stop (even if there is no result) we must set our own timeout on the
request (set to 5 seconds).
On success, the callback function is called. On timeout, the kSRVLookupComplete notification
is sent.
*/
- (void)attemptNAPTRFetch {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
DNSServiceRef sdRef;
DNSServiceErrorType err;
err = DNSServiceQueryRecord(&sdRef, 0, 0,
[server cStringUsingEncoding:[NSString defaultCStringEncoding]],
kDNSServiceType_NAPTR,
kDNSServiceClass_IN,
callback,
NULL);
// This stuff is necessary so we don't hang forever if there are no results
int dns_sd_fd = DNSServiceRefSockFD(sdRef);
int nfds = dns_sd_fd + 1;
fd_set readfds;
struct timeval tv;
int result;
int stopNow = 0;
int timeOut = 5; // Timeout in seconds
while (!stopNow) {
FD_ZERO(&readfds);
FD_SET(dns_sd_fd, &readfds);
tv.tv_sec = timeOut;
tv.tv_usec = 0;
result = select(nfds, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv);
if (result > 0) {
if(FD_ISSET(dns_sd_fd, &readfds)) {
err = DNSServiceProcessResult(sdRef);
if (err != kDNSServiceErr_NoError){
NSLog(@"There was an error");
}
stopNow = 1;
}
}
else {
printf("select() returned %d errno %d %s\n", result, errno, strerror(errno));
if (errno != EINTR) {
stopNow = 1;
postNotification(kSRVLookupComplete, nil);
}
}
}
DNSServiceRefDeallocate(sdRef);
});
}
然后,对于回调:
static void callback(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)
{
uint16_t order, pref;
char flag;
NSMutableString *service = [[NSMutableString alloc] init];
NSMutableString *replacement = [[NSMutableString alloc] init];
const char *data = (const char*)rdata;
order = data[1];
pref = data[3];
flag = data[5];
int i = 7;
while (data[i] != 0){
[service appendString:[NSString stringWithFormat:@"%c", data[i]]];
i++;
}
i += 2;
while(data[i] != 0){
if(data[i] >= 32 && data[i] <= 127)
[replacement appendString:[NSString stringWithFormat:@"%c", data[i]]];
else
[replacement appendString:@"."];
i++;
}
NSLog(@"\nOrder: %i\nPreference: %i\nFlag: %c\nService: %@\nReplacement: %@\n", order, pref, flag, service, replacement);
}
这似乎对我有用。您当然会使用回调中的所有已解析数据做任何其他必要的工作,或者将数据存储在某个地方以备后用。
关于ios - 查询 DNS 以在 iOS 中查找 NAPTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484813/
这可能看起来是一个非常简单的问题,但我还没有在互联网上找到答案。 任何人都可以告诉我如何对 SIP 域执行 NAPTR 查询吗? (这主要用于 DNS 查找),或者任何对我来说也很棒的引用(这个存在于
我有以下问题: 我有 5 台服务器,我想对它们进行负载平衡,第一台服务器 60%,其他四台服务器 10%。 我使用 NAPTR DNS 条目来回答这些服务器。 所有 5 个服务器将具有相同的 ORDE
我试图在 Go 中查询 NAPTR 记录。看来“网络”库中提供的 DNS 基础知识不会给我访问权限。因此,我正在考虑使用( see docs ),但找不到任何基本示例。是否有关于替代方案的任何建议或关
我对域名解析有疑问,我们可以通过函数getaddrinfo()或者NAPTR查询、SRV记录查询等过程,将DNS解析成ip地址格式A/AAAA 记录。1. 函数使用 getaddrinfo() 是否在
请帮助我理解以下 DNS 问题。这是关于 SIP 与 DNS 的交互。 当对域(例如 abc.com)进行 DNS 查询时,我们会返回两个 NAPTR RR 响应。 abc.com IN NAPTR
我在寻找查询 DNS 以在 iOS 中查找 NAPTR 的方法时遇到了很多麻烦。似乎有很多相对简单的方法来解析 IP,但我特别需要在 DNS 查找中找到所有 NAPTR 记录。如果可能的话,我更愿意这
我正在寻找使用 dnspython 在 python 中做这样的事情: dig @XXX.YYY.ZZZ.AAA -p 99 +short '1.1.1.1.1.1.1.1.1.1.1.e164.a
我不想使用 dnsjava 或其他第三方库。有什么方法可以找到 A 或 NAPTR 或任何其他记录的 TTL 和端口值?可能正在使用 java.net 包?使用 getallbyName,我可以获得
我是一名优秀的程序员,十分优秀!