boost::asio::ip::tcp::resolver::resolve()
をlocalhost
に5秒に1回呼び出す缶詰再生器があります。返されるエンドポイントの数をカウントし、その値を前の繰り返しと比較します。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);
}
}
サンプルセッション
あなたはそれが、その後、約3.5時間の一方のエンドポイント(127.0.0.1:80)を見つけた見ることができます~> 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
~>
2(127.0.0.1:80と[:: 1] :80)。私は不思議に思っています
- なぜエンドポイントの数が1から2に変わるのですか?
- 何が原因でしょうか?
ipv4とipv6の両方のアドレスを解決することは意図的なので、ipv4だけに制限したくありません。私はこの動作がasioに固有ではない可能性が高いことを認識しています。同じ動作を直接示すgetaddrinfo
を呼び出す再生器もあります。私のプラットフォームはppc64 RHEL 6.2です。私は他の場所での再生を試みていません。
':: 1'アドレスはIPv6ローカルホストアドレスです。 OSがIPv6を有効にしていることを認識するのに時間がかかるかもしれませんか? –
実行中のOSは何ですか? – gda2004
@ gda2004質問の最後の文を参照してください。ppc64 RHEL 6.2 –