Подтвердить что ты не робот

Как написать простой метод Ping в Cocoa/Objective-C

Мне нужно написать простой метод ping в Cocoa/Objective-C. Он также должен работать на iPhone.

Я нашел пример, который использует icmp, будет ли это работать на iPhone?

Я склоняюсь к решению с помощью NSNetServices, это хорошая идея?

Метод нужно только ping несколько раз и вернуть среднее значение и -1, если хост опущен или недоступен.

4b9b3361

Ответ 1

Нижеприведенный код работает синхронно:

const char *hostName = [@"stackoverflow.com"
                        cStringUsingEncoding:NSASCIIStringEncoding];
SCNetworkConnectionFlags flags = 0;
if (SCNetworkCheckReachabilityByName(hostName, &flags) && flags > 0) {
  NSLog(@"Host is reachable: %d", flags);
}
else {
  NSLog(@"Host is unreachable");
}

Примечание: SystemConfiguration.framework требуется

Ответ 2

Позвольте мне попробовать еще раз... на этот раз войти в систему и лучше форматировать; -)

StreamSCNetworkCheckReachabilityByName устарел и НЕ доступен для iPhone.

bool success = false;
const char *host_name = [@"stackoverflow.com" 
                         cStringUsingEncoding:NSASCIIStringEncoding];

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                        host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);

//prevents memory leak per Carlos Guzman comment
CFRelease(reachability);

bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
                             !(flags & kSCNetworkFlagsConnectionRequired);
if (isAvailable) {
    NSLog(@"Host is reachable: %d", flags);
}else{
    NSLog(@"Host is unreachable");
}

Примечание: требуется SystemConfiguration.framework

Ответ 3

У меня была эта же проблема, и в итоге я написал простую обертку вокруг SimplePing, чтобы написать об этом, написал блог об этом, и там какой-то код на github, надеюсь, поможет кому-то здесь:

http://splinter.com.au/how-to-ping-a-server-in-objective-c-iphone

Ответ 4

Вы ничего не пропустили - "Reachability" на самом деле не проверяет, что целевой домен действительно доступен, он оценивает только, есть ли путь к машине, по которой потенциальный доступ к целевому домену потенциально доступен. До тех пор, пока у вас есть какое-то исходящее соединение (например, активное wirless или проводное соединение) и конфигурация маршрутизации, которая приводит к цели, тогда сайт "достижим" до SCNetworkReachability.

Ответ 5

Pinging на iPhone работает немного иначе, чем на других платформах, из-за того, что у вас нет доступа root. См. Этот пример кода от Apple.

Ответ 7

Ответ Gene Myers опубликовал работу с использованием "SCNetworkReachabilityCreateWithName" для меня, но только в симуляторе. На моем устройстве (iPod w/OS 2.2.1) он всегда возвращает "Хост доступен" даже для бессмысленных адресов, таких как "zzz".

Я что-то не понимаю? Спасибо.

Здесь мой код на всякий случай:

Из Как написать простой метод Ping в Cocoa/Objective-C

    - (IBAction) TestReachability:(id)sender
{
    bool success = false;
    const char *host_name = [ipAddressText.textcStringUsingEncoding:NSASCIIStringEncoding];
    NSString *imageConnectionSuccess = @"Connected.png";
    NSString *imageConnectionFailed = @"NotConnected.png";

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                                host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
        !(flags & kSCNetworkFlagsConnectionRequired);
    if (isAvailable)
    {
        NSLog([NSString stringWithFormat: @"'%s' is reachable, flags: %x", host_name, flags]);
        [imageView setImage: [UIImage imageNamed:imageConnectionSuccess]]; 
    }
    else
    {
        NSLog([NSString stringWithFormat: @"'%s' is not reachable", host_name]);
        [imageView setImage: [UIImage imageNamed:imageConnectionFailed]]; 
    }
}

Ответ 8

Обратите внимание, что существует разница между симулятором и реальным iPhone. Симулятор не является настоящим симулятором, подобным тому, который поставляется Android, для большинства функций он использует классы Mac OSX.

Это особенно ад, если есть разница между Mac OSX и iPhonew (например, keychain).