我有一個罐頭播放器,每5秒調用boost::asio::ip::tcp::resolver::resolve()
localhost
一次。它計算返回的端點數並將該值與前一次迭代進行比較。來自Boost.Asio解析器的結果不同
#include <boost/asio.hpp>
#include <iostream>
int main(int argc, char *argv[])
{
if (argc < 3) {
std::cerr << argv[0] << " host port" << std::endl;
exit(EXIT_FAILURE);
}
const char* host = argv[1];
const char* service = argv[2];
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
size_t previous = 0;
while (true) {
boost::asio::ip::tcp::resolver::iterator i(
resolver.resolve(
boost::asio::ip::tcp::resolver::query(host, service)
)
);
size_t count(0);
while (i != boost::asio::ip::tcp::resolver::iterator()) {
std::cout << i->endpoint() << std::endl;
++i;
++count;
}
std::cout << "got " << count << " addresses" << std::endl;
if (previous == 0) {
previous = count;
}
assert(count == previous);
sleep(5);
}
}
示例會話
~> time ./addrinfo_asio localhost 80
...
127.0.0.1:80
got 1 addresses
[::1]:80
127.0.0.1:80
got 2 addresses
addrinfo_asio: addrinfo_asio.cc:35: int main(int, char**): Assertion `count == previous' failed.
Aborted (core dumped)
real 216m20.515s
user 0m0.181s
sys 0m0.193s
~>
你可以看到它發現一個端點(127.0.0.1:80)約3.5小時,然後發現了兩個(127.0.0.1:80和[:: 1] :80)。我想知道
- 爲什麼端點數從一個變到兩個?
- 什麼可能導致它?
解決ipv4和ipv6地址是故意的,我不想限制查詢只是ipv4。我意識到這種行爲可能不是特定於asio,我也有一個直接調用getaddrinfo
的播放器,它表現出相同的行爲。如果這是相關的,我的平臺是ppc64 RHEL 6.2。我沒有嘗試在其他地方複製。
「:: 1」地址是IPv6本地主機地址。也許OS需要很長時間才能意識到它啓用了IPv6? –
你正在使用的操作系統是什麼? – gda2004
@ gda2004查看問題的最後一句話,ppc64 RHEL 6.2 –