Привет,
Я работаю над приложением для iOS, которое требует программного разрешения DNS.
Считайте это прокси-сервером для разрешения всех DNS-запросов на iPhone. Я получаю DNS-запросы от каждого приложения на iPhone и отправляю обратно соответствующий IPList.
Я пробовал несколько методов, но у обоих были одинаковые ответы. Тот, который я решил использовать, приведен ниже функции resolveHost, написанной на objective-c и c. Я вызываю этот метод из быстрого кода.
Вот как я звоню из swift, а также делюсь образцом хоста / URL, значением хоста может быть любой домен («google.com, apple.com и т. Д.») Или домен / хост в результате следов при открытии сайта. в mkwebview
let host = "www.opera.com"
let ipArray = ResolveUtil (). resolveHost (host, usingDNSServer: "8.8.8.8") as! [Нить]
В частности, приложение Facebook плохо работает с IP-адресами, возвращаемыми функцией resolveHost
Под "плохой работой" я подразумеваю, что приложение не подключается к IP-адресам, возвращаемым функциями.
Иногда он возвращает 192.16.192.16 как часть других IP-адресов для некоторых хостов / доменов. Что это за IP?
- (NSArray*)resolveHost:(NSString *)host usingDNSServer:(NSString *)dnsServer
{
NSMutableArray* result = [[NSMutableArray alloc] init];
struct __res_state res;
setup_dns_server(&res, [dnsServer cStringUsingEncoding:NSASCIIStringEncoding]);
int count;
char** ips = query_ips(&res, [host cStringUsingEncoding:NSUTF8StringEncoding], &count);
for (int i=0; i<count; i++){
[result addObject:[[NSString alloc] initWithCString:ips[i] encoding:NSASCIIStringEncoding]];
}
for (int i=0; i<count; i++){
free(ips[i]);
}
free(ips);
ips = NULL;
return result;
}
char ** query_ips(res_state res, const char *host, int* count)
{
u_char answer[NS_PACKETSZ];
int len = res_nquery(res, host, ns_c_in, ns_t_a, answer, sizeof(answer));
ns_msg handle;
ns_initparse(answer, len, &handle);
int messageCount = ns_msg_count(handle, ns_s_an);
*count = messageCount;
char **ips = malloc(messageCount * sizeof(char *));
for (int i=0; i < messageCount; i++) {
ips[i] = malloc(16 * sizeof(char));
memset(ips[i], '\0', sizeof(16));
ns_rr rr;
if(ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
strcpy(ips[i], inet_ntoa(*(struct in_addr *)ns_rr_rdata(rr)));
}
}
return ips;
}
Другой метод
func resolveIp(_ hostUrl:String) -> [String]{
var ips:[String] = [String]()
let host = CFHostCreateWithName(nil,hostUrl as CFString).takeRetainedValue()
CFHostStartInfoResolution(host, .addresses, nil)
var success: DarwinBoolean = false
if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray? {
for case let theAddress as NSData in addresses {
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length),
&hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 {
let numAddress = String(cString: hostname)
ips.append(numAddress)
}
}
}
Logger.info("\(#function) validIPs:\(ips.joined(separator: "-")) url:\(hostUrl)")
return ips
}
resolveHost:usingDNSServer:
- особенно интересны значения аргументов. - person zrzka   schedule 18.06.2020resolveHost2:...
, но вы указали кодresolveHost:...
. Какая разница? Передачаurl
аргументуhost
также выглядит подозрительно. Какое значение имеетurl
? - person zrzka   schedule 18.06.2020