Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Alex DОтветов: 3

Мне интересно, почему некоторые функции монотач хорошо работают в симуляторе, но не работают на реальном устройстве? тот же класс 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!

iosiphoneping

Ответы

Ответ 1 · рейтинг 4 · Rolf Bjarne Kvinge

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

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

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

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

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

Ответ 2 · рейтинг 3 · Paul Knopf

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, так как обнаружил, что он действительно работает.

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

Ответ 3 · рейтинг 1 · poupou

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

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

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

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

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы