Tôi có trình tạo bản sao đóng hộp gọi boost::asio::ip::tcp::resolver::resolve()
trên localhost
sau mỗi 5 giây. Nó đếm số điểm cuối được trả về và so sánh giá trị đó với lần lặp trước đó.kết quả từ trình phân giải Boost.Asio khác nhau
#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);
}
}
phiên mẫu
~> 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
~>
Bạn có thể nhìn thấy nó tìm thấy một thiết bị đầu cuối (127.0.0.1:80) trong khoảng 3,5 giờ, sau đó tìm thấy hai (127.0.0.1:80 và [:: 1] : 80). Tôi tự hỏi
- tại sao số điểm cuối thay đổi từ một đến hai?
- điều gì có thể gây ra?
Giải quyết cả địa chỉ ipv4 và ipv6 là cố ý, tôi không muốn giới hạn truy vấn chỉ ipv4. Tôi nhận ra hành vi này có khả năng không cụ thể với asio, tôi cũng có một trình sao chép gọi trực tiếp getaddrinfo
thể hiện hành vi tương tự. Nền tảng của tôi là ppc64 RHEL 6.2 nếu nền tảng đó có liên quan. Tôi đã không cố gắng sao chép ở nơi khác.
Địa chỉ ':: 1' là địa chỉ IPv6 localhost. Có thể mất quá nhiều thời gian để hệ điều hành nhận ra nó đã kích hoạt IPv6? –
os bạn đang chạy là gì? – gda2004
@ gda2004 xem câu cuối cùng của câu hỏi, ppc64 RHEL 6.2 –