boost :: asio :: ip :: tcp :: resolver :: resolve()永远阻止

时间:2009-03-23 23:26:42

标签: c++ boost g++ boost-asio resolver

我正在尝试创建与boost.asio示例中的this code类似的内容。

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 个答案:

答案 0 :(得分:4)

在printf之后,可能会阻止连接调用。

默认情况下,stdout是行缓冲的,因为你的printf字符串末尾没有\ n,所以你看不到它的输出。当您终止程序时,正在刷新缓冲区,这就是您看到该消息的原因。