гетаддринфо в айфоне - PullRequest
       14

гетаддринфо в айфоне

5 голосов
/ 06 августа 2009

Я готовлю небольшую заявку. Когда я перезагружаю свой iPhone 3G (с подключением к интернету 3G) и устанавливаю это приложение, getaddrinfo всегда возвращает EAI_NONAME (8). Я закрываю приложение и запускаю Safari, затем запускаю мое приложение - все работает. В чем проблема?

- (void)viewDidLoad {
    [super viewDidLoad];

    const char* hostname = "google.com";

    struct addrinfo hints, *res;
    int retval;

    memset (&hints, 0, sizeof (struct addrinfo));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    retval = getaddrinfo (hostname, NULL, &hints, &res);
    if (retval == 0) {
        freeaddrinfo (res);
    }else if(retval == EAI_NONAME)
    {
        //noname
    }
}

Ответ от Apple:

Привет Павел,

Я отвечаю на ваш вывод о том, что попытка использовать функцию BSD getaddrinfo проблематична при попытке установить соединение, где возможно только соединение с беспроводной глобальной сетью (WWAN) (EDGE, 3G). Проблема, с которой вы столкнулись, заключается в том, что из соображений экономии заряда аккумулятора WWAN будет отключаться, когда сетевые службы не нужны. Тогда возникает вопрос, как активировать WWAN, когда требуются сетевые сервисы.

Официально поддерживаемый механизм установления соединения с WWAN заключается в использовании API-интерфейса CFSocketStream (или зависимого API-интерфейса - NSSocket, а также CFHTTPStream, CFFTPStream, NSURLRequest и NSURLConnection API-интерфейсов). Это означает, что официально поддерживается только TCP. Это ограничение влияет на все приложения на основе сокетов UDP и BSD. Использование вызова BSD Connect не приведет к включению iPhone в WWAN. Это ограничение также распространяется на все другие функции BSD, которые при подключении WiFi могут привести к пакетной передаче.

Однако в текущей операционной системе iPhone после установления соединения WWAN использование разъемов BSD и функций CFSocket будет поддерживать соединение WWAN. Это позволяет приложению на основе сокетов UDP или BSD устанавливать соединение WWAN с помощью API CFSocketStream для установления соединения с сервером TCP (включая веб-серверы HTTP). Как только соединение станет активным, программа сможет функционировать, как в прошлом. Это то, что Safari, Mail и другие приложения Apple, которые используют сетевые службы, используют для установления своих соединений. По этой причине, когда вы запускаете Safari, то при запуске приложения работает сетевой доступ. При использовании Safari iPhone устанавливает соединение WWAN. Когда вы выходите из Safari, WWAN не отключается автоматически - он остается активным в течение короткого периода времени. Если вы запускаете ваше приложение, службы WWAN активны, и ваше приложение заставит WWAN оставаться активным до тех пор, пока существует сетевая активность.

Если ваше приложение будет использовать TCP для работы в сети, то вы можете изменить свой код, чтобы использовать CFSocketStream или зависимый API для работы в сети. Конечно, если у вас есть целая библиотека функциональных возможностей сокетов BSD, это не может быть разумным решением для тех, кто хочет выложить свое приложение в App Store очень скоро.

....

1 Ответ

1 голос
/ 06 августа 2009

Вероятно, здесь происходит то, что getaddrinfo() не блокирует ожидание поиска DNS, что, возможно, хорошо, поскольку поиск DNS на iPhone может занять очень много времени. Как только вы выполнили поиск в другом месте, он дает вам кэшированный ответ.

Взгляните на CFHost , который является предпочтительным способом получения такой информации на iPhone. Он поддерживает асинхронные обратные вызовы, чтобы вы знали, когда информация доступна, или вы можете делать синхронные вызовы, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...