Ошибка Boost ASIO «Хост не найден» на iOS

#c #ios #boost #boost-asio

#c #iOS #boost #boost-asio

Вопрос:

У меня есть приложение, которое отправляет многоадресное сообщение по локальной сети раз в секунду. Этот код отлично работает как на Windows, так и на macOS, и он отлично работает на iOS, если сеть не подключена к Интернету.

         boost::asio::ip::tcp::resolver resolver(m_IOservice);
        boost::system::error_code ec;
        boost::asio::ip::tcp::resolver::query query(boost::asio::ip::host_name(),"");
        boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(query, ec);
        boost::asio::ip::address interface_ip_address;

        while(it!=boost::asio::ip::tcp::resolver::iterator())
        {
            interface_ip_address = (it  )->endpoint().address();
            if(interface_ip_address.is_v4())
            {
                // Message sending code here
            }
        }
  

Проблема возникает в resolver.resolve(), где я получаю исключение с «Хост не найден (авторитетный)» в качестве ошибки.

Я не уверен, что действительно понимаю, почему возникает эта ошибка, и, конечно, не знаю, как ее исправить. Может ли кто-нибудь пролить свет на это для меня?

Комментарии:

1. Эй, где вы можете получить библиотеку boost asio, работающую на устройствах iOS? Вызывают ли они какие-либо проблемы с циклом выполнения.

2. Да, у нас все заработало, и у нас не было проблем. Код boost ethernet выполняется в отдельном потоке, затем передает данные (потокобезопасным способом) в основной поток цикла выполнения для обработки

3. Спасибо. Просто чтобы было ясно, вы ничего не настраиваете в цикле событий io_services? asio получает данные, и вы просто передаете их в другой поток.

4. Да, именно так. Никаких настроек в цикле событий io_services. Код Boost asio на самом деле очень прост и очень надежен.

Ответ №1:

Что возвращает host_name? Вероятно, он возвращает имя, которое не разрешается.

Если вы просто хотите localhost, используйте boost::asio::ip::addressv4() или даже boost::asio::ip::address::from_string("127.0.0.1") .

В качестве альтернативы добавьте запись в свой /etc/hosts файл:

  127.0.0.1 thehostnametoresolvetolocalhost