2009-04-28 2 views
18

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

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

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

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

ответ

-5

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

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

+3

К сожалению , SCNetworkCheckReachabilityByName теперь устарела. –

+28

8 голосов и + бонусы за код, который полностью не делает того, о чем был вопрос, т. Е. Ping/traceroute, но в основном это поиск DNS. – bestsss

+0

Код не только устарел, но и ищет DNS –

35

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

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

+0

Спасибо человеку, что у вас есть лучшее решение с достижимостью – YannickSteph

+0

Привет. Отличный код и полезный, но только одно. Вам необходимо добавить код 'CFRelease (достижимость)' после вызова 'SCNetworkReachabilityGetFlags', чтобы освободить переменную достижимости (чтобы предотвратить утечку памяти), как указано в [documentation] (https://developer.apple.com/reference/systemconfiguration/1514904- scnetworkreachabilitycreatewithn? language = objc) –

+0

'SCNetworkReachabilityGetFlags' является плохой заменой ping - если устройство подключено к сети, будет установлено' kSCNetworkFlagsReachable', и 'kSCNetworkFlagsConnectionRequired' будет отключено, даже если целевой хост находится в автономном режиме. – adib

0

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

Я что-то не понимаю? Благодарю.

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

От How to write a simple Ping method in 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]]; 
    } 
} 
0

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

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

13

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

5

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

+0

Этот файл удален из библиотеки разработчиков Apple. –

32

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

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

+13

Upvote для решения, которое на самом деле отвечает на вопрос (против всего этого бесполезного материала, который нравится людям, но который полностью не решает вопрос!). Спасибо! –

+0

Человек, которого вы качаете: D –

+0

Да, это реальный ответ. – user623396

Смежные вопросы