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

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

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

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

Метод нужно только ping несколько раз и вернуть среднее значение и -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

Позвольте мне попробовать еще раз … на этот раз зайти в систему и форматировать лучше 😉

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

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

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

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

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

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

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

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

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

From Как написать простой метод 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]]; } } 

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

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

  • Заставить приложение запускаться под определенной версией .NET?
  • android BluetoothDevice.getName () return null
  • пустой белый экран после входа в FB через веб-приложение?
  • В чем разница между KeyDown и KeyPress в .NET?
  • Вопросы, на которые должен отвечать каждый хороший разработчик .NET?
  • Не удалось загрузить тип 'System.Runtime.CompilerServices.ExtensionAttribute' из сборки 'mscorlib
  • Как добавить заголовок сообщения в запрос при использовании клиента по умолчанию для сети Azure?
  • Как получить относительный путь от абсолютного пути
  • Сравнение сетевых библиотек Android: OkHTTP, Retrofit и Volley
  • BroadcastReceiver получает несколько идентичных сообщений для одного события
  • Определение активного сетевого интерфейса
  • Давайте будем гением компьютера.