boost::asio::ip::tcp::resolver::разрешить() блокирует навсегда

StackOverflow https://stackoverflow.com/questions/675614

Вопрос

Я пытаюсь создать что-то похожее на этот код найдено в 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, вы не увидите его выходных данных.Когда вы завершаете работу программы, буфер очищается, вот почему тогда вы видите это сообщение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top