#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