Как написать простой метод Ping в Какао / Objective-C - PullRequest
19 голосов
/ 28 апреля 2009

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

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

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

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

Ответы [ 8 ]

35 голосов
/ 06 июля 2009

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

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's 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

32 голосов
/ 27 января 2012

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

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

13 голосов
/ 09 ноября 2009

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

5 голосов
/ 26 апреля 2010

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

2 голосов
/ 28 апреля 2009

Просмотр CFHost и, в частности, CFHostGetReachability . Также имеется образец кода CFHost , который включает подпрограмму для проверки доступности хоста.

0 голосов
/ 19 октября 2009

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

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

0 голосов
/ 13 августа 2009

В ответе Джин Майерс опубликовал работы, используя для меня «SCNetworkReachabilityCreateWithName» - но только в симуляторе. На моем устройстве (iPod w / OS 2.2.1) оно всегда возвращает «Хост доступен» даже для бессмысленных адресов, таких как «zzz».

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

Вот мой код на всякий случай:

С Как написать простой метод Ping в Какао / 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]]; 
    }
}
0 голосов
/ 17 июня 2009

Кажется, что код ниже работает синхронно:

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 требуется

...