пинг в монотаче

Мне интересно, почему некоторые функции монотач хорошо работают в симуляторе, но не работают на реальном устройстве? тот же класс Ping. он отлично работает из симулятора, но не работает на устройстве. В чем разница? есть ли способ заставить его работать на устройстве?

Более того, я нашел эту статью о том, как реализовать пинг в mac OS: http://developer.apple.com/library/mac/#samplecode/SimplePing/Listings/SimplePing_m.html#//apple_ref/doc/uid/DTS10000716-SimplePing_m-DontLinkElementID_5

можно ли будет портировать этот код на монотач? честно говоря, я еще не пробовал, работает ли это на iOS, но я ничего не вижу, почему бы это не работать там.

PS. Я знаю о классе Reachability, и да, я использую его в своих проектах вместо ping!


person Alex D    schedule 02.12.2011    source источник


Ответы (3)


Скорее всего, это проблема с тем, что позволяет вам делать iOS.

Вот от одного парня, который пытался реализовать ping с использованием необработанных сокетов и столкнулся с ограничениями iOS.

Исходный отчет об ошибке гласит: "Для проверки связи требуется возможность ядра (capget) или бинарный файл ping на несуществующем устройстве». Другими словами: root-доступ.

Вот обходной путь, но это не реализация проверки связи.

Тем не менее, похоже, что кто-то успешно пытался перенести образец SimplePing на iOS, так что, возможно, в конце концов, это возможно, но это просто не было приоритетом для изучения этого (класс Reachability в конце концов доступен).

person Rolf Bjarne Kvinge    schedule 02.12.2011

SimplePing для MonoTouch теперь доступен здесь.

https://github.com/theonlylawislove/MonoTouch.SimplePing

Просто добавьте этот репозиторий git в качестве подмодуля в свой проект, затем «Добавить существующий проект» и добавьте «MonoTouch.SimplePing» в свой проект. Существует один небольшой вспомогательный класс, который немного упростит работу в проекте "MonoTouch.SimplePing.Test" под названием "SimplePingHelper".

Затем используйте следующий код.

SimplePingHelper.Ping (
    "192.168.5.77", 
    1000, 
    () => {
        NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => {
            var alertView = new UIAlertView ("Response", "Success", null, null, new string[] { "Ok" });
            alertView.Show ();
        }));
    }, 
    () => {
        NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => {
            var alertView = new UIAlertView ("Response", "Failure", null, null, new string[] { "Ok" });
            alertView.Show ();
        }));
    });

Это решение работает в симуляторе и на каждом устройстве, которое я тестировал.

Не используйте какие-либо приемы «RawSocket», найденные в Интернете. Он пронизан ошибками с асинхронным кодом и проблемами с его работой на некоторых устройствах, а не на других. Вырвав себе волосы, я решил портировать этот проект SimplePing, так как обнаружил, что он действительно работает.

Наслаждаться!

person Paul Knopf    schedule 29.10.2013

Мне интересно, почему некоторые функции монотач хорошо работают в симуляторе, но не работают на реальном устройстве?

MonoTouch запросит операционную систему, например. сетевой стек в этом случае, чтобы сделать его ставку. Операционная система может отличаться (и есть) между симулятором iOS и устройствами, а также вести себя по-разному во время выполнения.

В чем разница?

Просто чтобы еще раз подчеркнуть главный факт, что Apple SDK предоставляет симулятор iOS, который не эмулятор. Он даже не пытается эмулировать большинство ограничений устройств. Например. Это:

  • выполнять код x86, а не код ARM (как этого требует эмулятор Android);

  • позволяет выполнять JIT (что приятно, поскольку позволяет MonoTouch очень быстро строить для отладки в симуляторе). Это не разрешено (или даже возможно) на устройствах, и мы должны использовать компиляцию AOT;

  • предоставлять полный доступ к файловой системе (насколько может читать текущий пользователь);

  • не обеспечивает имитационную поддержку некоторых конкретных функций устройств (например, акселерометра);

  • список продолжается...

Некоторые различия велики (это намного быстрее, чем эмулятор, работающий с кодом ARM), в то время как другие могут быть довольно ограничивающими (например, отсутствие поддержки аппаратных функций) в определенных сценариях.

person poupou    schedule 02.12.2011
comment
Любопытно: вы когда-нибудь думали об использовании JIT на устройстве для отладочных сборок вместо AOT? Разве это не облегчило бы жизнь всем? - person Krumelur; 02.12.2011