boost::asio::ip::tcp::resolver::разрешить() блокирует навсегда
-
21-08-2019 - |
Вопрос
Я пытаюсь создать что-то похожее на этот код найдено в boost.asio examples.asio примеры.
гнездо.h:
class some_class {
private:
...
boost::asio::io_service io_service;
public:
some_class() {
/* This stuff isn't used in the example...
...but it doesn't change anything... */
io_service.run();
}
};
socket.cpp:
using boost::asio::ip::tcp;
bool some_class::connect(char* host, char* port)
{
printf("Resolving hostname...\n");
/* Resolve hostname. */
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), host, port);
tcp::resolver::iterator iterator = resolver.resolve(query);
printf("Connecting to %s:%s... ", host, port);
/* Connect to resolved hosts. */
sock->connect(*iterator);
return true;
}
g ++ создает это без каких-либо ошибок, но код никогда не проходит мимо вызова resolver.resolve().
Я пробовал как "127.0.0.1", так и "localhost" для хоста и "80" для порта.(не думаю, что это должно иметь значение, но apache2 запущен)
Когда я нажимаю ctrl + c из своего приложения, оно, очевидно, завершается, но оно выводит "Подключение к строке" непосредственно перед этим.
Я планирую сам создать пример и посмотреть, возникнет ли такая же проблема, и обязательно опубликую результаты здесь.Кто-нибудь сталкивался с этой проблемой или знает, что могло вызвать такое поведение?
Редактировать:
Пример выполняется просто отлично...Полагаю, мне нужно кое-что отладить.
вторая правка:
Я не понимаю, единственное, что может быть другим, - это хост / порт.
Пример использует char* argv[], и я использую:
char host[] = "localhost";
char port[] = "80";
третья правка:
похоже, это действительно блокируется при подключении, забыл выполнить fflush (стандартный вывод).тогда это, должно быть, проблема с сокетом.собираюсь провести еще несколько тестов.
четвертая правка:
глупый я, это вообще не блокировалось!Я просто слишком полагался на вывод на консоль..
Решение
Вероятно, это блокируется при вызове connect после printf.
стандартный вывод по умолчанию буферизуется в строке, и поскольку у вас нет символа в конце вашей строки printf, вы не увидите его выходных данных.Когда вы завершаете работу программы, буфер очищается, вот почему тогда вы видите это сообщение.