192.16.192.16
Что это за IP? Совершенно действующий IPv4. Он возвращается к basento.nikhef.nl
.
Почему он возвращается?
Я не знаю. Возможно, см. resolv.h
:
* Mac OS supports a DNS query routing API (see <dns.h>) which is used by
* most system services to access DNS. The BIND-9 APIs described here are
* a lower-level that does not do query routing or search amongst multiple
* resolver clients. The results of DNS queries from this API may differ
* significantly from the results of queries sent to the <dns.h> API. We
* strongly encourage developers to use higher-level APIs where possible.
Под «неработающим» я подразумеваю, что приложение не подключается к IP-адресам, возвращаемым функциями.
Это не имеет никакого отношения с разрешением имени / ip адреса.
Проблема может быть в другом месте. Ваш провайдер может заблокировать его, на IP-адресе не запущена служба, вам не разрешен доступ к нему ... По многим причинам.
В частности, приложение Facebook не работает с возвращаемыми IP-адресами из функции resolveHost.
Для меня это вообще не имеет смысла. У вас есть собственное приложение, вы разрешаете в нем IP-адреса, а затем говорите, что оно не работает с Facebook. Честно говоря, я понятия не имею, что вы имеете в виду.
Почему я отвечаю на этот вопрос? Что ж, вы не должны слепо копировать и вставлять код из других вопросов о переполнении стека или любых других сайтов. Провел исследование, и оно похоже на копирование и вставку некоторых других ответов.
Почему? Код в вашем вопросе не обрабатывает ошибки, не соответствует документации ... Это чистая удача, что он работает для вас.
Что, если это ваша проблема? Вы когда-нибудь рассматривали этот вариант?
Вот пример Resolver
, который вы можете использовать / test с вашими условиями. Это может решить ваши проблемы, а может и не решить.
#import <resolv.h>
@import Darwin.POSIX.arpa;
@interface Resolver: NSObject
- (nullable instancetype)initWithDNSServer:(nonnull NSString *)server;
- (nullable NSArray<NSString *> *)resolveHost:(nonnull NSString *)host;
@end
@implementation Resolver {
struct __res_state *state;
}
- (void)dealloc {
if (state != NULL) {
// man 3 resolver:
//
// res_ndestroy() should be call to free memory allocated by res_ninit() after last use.
if ((state->options & RES_INIT) == RES_INIT) {
res_ndestroy(state);
}
free(state);
state = NULL;
}
}
- (nullable instancetype)initWithDNSServer:(nonnull NSString *)server {
if ((self = [super init]) == nil) {
return nil;
}
// man 3 resolver:
//
// The memory referred to by statp must be set to all zeros prior
// to the first call to res_ninit(). res_ndestroy() should be call to free memory
// allocated by res_ninit() after last use.
if ((state = calloc(1, sizeof(*state))) == NULL) {
return nil;
}
// 0 success
if (res_ninit(state) != 0) {
return nil;
}
// Avoid calling inet_aton later with NULL if we can't convert it to ASCII
if (![server canBeConvertedToEncoding:NSASCIIStringEncoding]) {
return nil;
}
struct in_addr addr;
// man 3 inet_aton:
//
// It returns 1 if the string was successfully interpreted ...
if (inet_aton([server cStringUsingEncoding:NSASCIIStringEncoding], &addr) != 1) {
return nil;
}
state->nsaddr_list[0].sin_addr = addr;
state->nsaddr_list[0].sin_family = AF_INET;
state->nsaddr_list[0].sin_port = htons(NS_DEFAULTPORT);
state->nscount = 1;
return self;
}
- (nullable NSArray<NSString *> *)resolveHost:(nonnull NSString *)host {
// Avoid calling res_nquery with NULL
if (![host canBeConvertedToEncoding:NSASCIIStringEncoding]) {
return nil;
}
u_char answer[NS_PACKETSZ];
int len = res_nquery(state, [host cStringUsingEncoding:NSASCIIStringEncoding],
ns_c_in, ns_t_a, answer, sizeof(answer));
// -1 = error
if (len == -1) {
return nil;
}
ns_msg handle;
// 0 success, -1 error
if (ns_initparse(answer, len, &handle) != 0) {
return nil;
}
u_int16_t count = ns_msg_count(handle, ns_s_an);
NSMutableArray *result = [NSMutableArray arrayWithCapacity:count];
for (int i = 0 ; i < count ; i++) {
ns_rr rr;
// 0 success, -1 error
if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
char *address = inet_ntoa(*(struct in_addr *)ns_rr_rdata(rr));
if (address == NULL) {
continue;
}
NSString *ip = [NSString stringWithCString:address
encoding:NSASCIIStringEncoding];
[result addObject:ip];
}
}
return result;
}
@end
Вы можете использовать его следующим образом:
Resolver *resolver = [[Resolver alloc] initWithDNSServer:@"8.8.8.8"];
NSLog(@"%@", [resolver resolveHost:@"www.opera.com"]);
Вывод:
(
"13.102.114.111",
"52.57.141.185",
"18.196.127.98"
)