Невозможно проверить доступность определенного IP-адреса. Поддерживает ли какой-либо из фреймворков MAC это?

Шаги, которые я выполнил 1) Добавлена ​​структура конфигурации системы и импортирован #import "systemconfiguration/scnetworkreachability.h", а затем добавлен ниже код для проверки подключения

BOOL hasLeadingNumberInString(NSString* s) {
  if(s)
      return [s length] && isnumber([s characterAtIndex:0]);
else
    return NO;
}

-(BOOL)networkConnected: (NSString *)ipAdress  {
    SCNetworkReachabilityFlags  flags = 0;
    SCNetworkReachabilityRef    netReachability;
    BOOL                        retrievedFlags = NO;

    // added the "if" and first part of if statement
    //
    if (hasLeadingNumberInString(ipAdress)) {
        struct sockaddr_in the_addr;
        memset((void *)&the_addr, 0, sizeof(the_addr));
        the_addr.sin_family = AF_INET;
        the_addr.sin_len = sizeof(the_addr);
        const char* server_addr = [ipAdress UTF8String];
        unsigned long ip_addr = inet_addr(server_addr);
        the_addr.sin_addr.s_addr = ip_addr;
        netReachability =    SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&the_addr);
    } else {
        netReachability = SCNetworkReachabilityCreateWithName(NULL, [ipAdress UTF8String]);
    }
    if (netReachability) {
        retrievedFlags = SCNetworkReachabilityGetFlags(netReachability, &flags);
        CFRelease(netReachability);
    }
    if (!retrievedFlags || !flags) {
        return NO;
    }
    return YES;
}

- (void)checkconnectivity
{
    if([self networkConnected:@"192.168.2.10" ])
        NSLog(@"Connected");
    else
         NSLog(@"Not Connected");

}

Ради бога, он всегда возвращается подключенным.

метод 2, которому я следовал, я добавил AFnetworking с помощью cocopods. Я импортировал файл «AFNetworkReachabilityManager.h» и использовал managerforaddress, он всегда возвращает неизвестный

 AFNetworkReachabilityManager *addressCheck=[AFNetworkReachabilityManager managerForAddress:@"192.168.3.10"];
   [addressCheck startMonitoring];
    [addressCheck setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
    }];

    NSLog(@"%hhd",addressCheck.reachable);
    NSLog(@"%hhd",[addressCheck isReachable]);

    NSString *str=[[NSString alloc]initWithString:[addressCheck localizedNetworkReachabilityStatusString]];
    NSLog(@"%@",str);

    NSLog(@"%@",addressCheck.localizedNetworkReachabilityStatusString);

}

Даже таким образом я не могу подключиться к определенному адресу. Есть ли способ получить это или это невозможно.


person MacDeveloper    schedule 25.07.2016    source источник
comment
В методе 1 !flags должно быть !(flags & kSCNetworkReachabilityFlagsReachable), верно?   -  person Droppy    schedule 25.07.2016
comment
Даже после смены вышеуказанной модификации результата нет. спасибо   -  person MacDeveloper    schedule 26.07.2016


Ответы (1)


Вы можете просто использовать команду Process и ping, чтобы проверить, доступен ли IP-адрес.

Пример Swift 4: (только macOS)

func ping(at ipAddress: String) -> Int32 {
    let process = Process.launchedProcess(launchPath: "/sbin/ping", arguments: ["-c1", ipAddress])
    process.waitUntilExit()
    return process.terminationStatus
}

let reachable = ping(at: "10.0.1.119") == 0
person Alejandro Cotilla    schedule 18.10.2018