代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

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

  •  4
  • Daniel Sloof  · 技术社区  · 17 年前

    我正在尝试创建类似于 this code 在boost.asio示例中找到。

    插座:

    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();
            }
    };
    

    Copp.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从应用程序中删除时,它显然会终止,但它会在输出“connecting to string”之前输出它。

    我正计划自己构建这个例子,看看是否也出现了同样的问题,并且肯定会在这里发布结果。是否有人遇到过此问题或知道什么可能导致此行为?

    编辑:
    这个例子运行得很好…我想我还有一些调试工作要做。

    第二次编辑:
    我不明白,唯一可能不同的是主机/端口。
    示例使用char*argv[],我使用的是:

    char host[] = "localhost";
    char port[] = "80";
    

    第三编辑:
    它确实似乎在连接处阻塞,忘记了fflush(stdout)。那么它一定是插座出了问题。还要做些测试。

    第四编辑:
    愚蠢的我,它一点也不阻挡!我只是太依赖控制台输出了。

    1 回复  |  直到 16 年前
        1
  •  4
  •   camh    17 年前

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

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

    推荐文章