gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:36 31 4
gpt4 key购买 nike

我正在尝试创建类似于 this code 的东西在 boost.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();
}
};

套接字.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 的问题。将进行更多测试。

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

最佳答案

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

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

关于c++ - boost::asio::ip::tcp::resolver::resolve() 永远阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675614/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com