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

Posted

技术标签:

【中文标题】boost::asio::ip::tcp::resolver::resolve() 永远阻塞【英文标题】:boost::asio::ip::tcp::resolver::resolve() blocks forever 【发布时间】:2009-03-23 23:26:42 【问题描述】:

我正在尝试创建类似于 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)。那么肯定是socket有问题了。要做更多的测试。

第四次编辑: 愚蠢的我,它根本没有阻塞!我只是太依赖控制台输出了..

【问题讨论】:

【参考方案1】:

它可能在 printf 之后阻塞了连接调用。

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

【讨论】:

套接字没有问题,只是我通过查看输出假设它阻塞了。这个答案帮助我弄清楚了,接受了:)

以上是关于boost::asio::ip::tcp::resolver::resolve() 永远阻塞的主要内容,如果未能解决你的问题,请参考以下文章