boost :: asio :: ip :: tcp :: resolver :: resol () блокирует навсегда - PullRequest
4 голосов
/ 24 марта 2009

Я пытаюсь создать нечто похожее на этот код , найденный в примерах boost.asio.

socket.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 (stdout). тогда это должно быть проблема с сокетом. собираюсь сделать еще тестирование.

четвертое редактирование:
глупый я, это не блокировало вообще! Я просто слишком полагался на вывод консоли ..

1 Ответ

4 голосов
/ 24 марта 2009

Вероятно, это блокирует вызов для подключения после printf.

stdout по умолчанию является буферизованной строкой, и, поскольку у вас нет \ n в конце строки printf, вы не увидите ее вывод. Когда вы убиваете программу, буфер очищается, поэтому вы видите сообщение.

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