![](/img/trans.png)
[英]What's the lifetime of boost::asio::ip::tcp::resolver::iterator from async_resolve?
[英]boost::asio::ip::tcp::resolver::resolve() blocks forever
我正在嘗試創建與 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 退出我的應用程序時,它顯然會終止,但它會在 output 之前執行“連接到字符串”。
我計划自己構建示例並查看是否出現相同的問題,並且肯定會在此處發布結果。 有沒有人遇到過這個問題或知道什么可能導致這種行為?
編輯:
這個例子運行得很好......我想我有一些調試要做。
第二次編輯:
我不明白,唯一可能不同的是主機/端口。
示例使用 char* argv[] 我正在使用:
char host[] = "localhost";
char port[] = "80";
第三次編輯:
它確實似乎在連接時阻塞,忘記了 fflush(stdout)。 那么肯定是socket有問題了。 要做更多的測試。
第四次編輯:
愚蠢的我,它根本沒有阻塞。 我只是過於依賴控制台 output..
在 printf 之后,它可能阻塞了連接調用。
默認情況下,stdout 是行緩沖的,並且由於 printf 字符串的末尾沒有 \n,因此您將看不到它的 output。 當您終止程序時,緩沖區正在被刷新,這就是您看到該消息的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.