# HG changeset patch # User František Kučera # Date 1659735948 -7200 # Node ID fcc5ed0fab9f9158375b6cb3e1bc3483be9d159f # Parent a910051cd9757114ed6d05c0aebe8e494c29a703 AddressInfos [] = addrinfo& diff -r a910051cd975 -r fcc5ed0fab9f src/Socket.cpp --- a/src/Socket.cpp Thu Aug 04 22:49:17 2022 +0200 +++ b/src/Socket.cpp Fri Aug 05 23:45:48 2022 +0200 @@ -79,11 +79,79 @@ else throw std::logic_error("Invalid address family: " + std::to_string(ai->ai_family)); } +class AddressInfos { +private: + struct addrinfo* addrInfo; + + AddressInfos(addrinfo* addrInfo) : addrInfo(addrInfo) { + std::cerr << " AddressInfo()" << std::endl; + } + +public: + + virtual ~AddressInfos() { + std::cerr << " ~AddressInfo()" << std::endl; + freeaddrinfo(addrInfo); + } + + class AddressInfo { + public: + const addrinfo* const ai; + + AddressInfo(const addrinfo* const ai) : ai(ai) {} + }; + + static AddressInfos getAddressInfo(const std::string& host, const std::string& port) { + struct addrinfo query; + memset(&query, sizeof (query), 0); + query.ai_family = AF_UNSPEC; + query.ai_socktype = SOCK_STREAM; + query.ai_protocol = IPPROTO_TCP; + query.ai_flags = AI_ALL; + + struct addrinfo* addrInfo; + check(getaddrinfo(host.c_str(), port.c_str(), &query, &addrInfo), "getaddrinfo"); + + return AddressInfos(addrInfo); + } + + const sockaddr* getSocketAddress() { + return addrInfo->ai_addr; + } + + const std::size_t size() const { + std::size_t size = 0; + for (addrinfo* ai = addrInfo; ai; ai = ai->ai_next) size++; + return size; + } + + const addrinfo& operator[](std::size_t index) const { + for (addrinfo* ai = addrInfo; ai; index--) { + if (index == 0) return *ai; + else ai = ai->ai_next; + } + + throw std::out_of_range("invalid index for AddressInfo: " + std::to_string(index)); + } + +}; + static in_addr_t getAddress(const std::string& host) { + { + AddressInfos ai = AddressInfos::getAddressInfo("::0ff2", "smtp"); + std::cerr << "AddressInfo size = " << ai.size() << std::endl; + for (size_t i = 0, limit = ai.size(); i < limit; i++) { + std::cerr << "AddressInfo: " << ip2string(&ai[i]) << std::endl; + } + } + + + + struct addrinfo query; memset(&query, sizeof (query), 0); - query.ai_family = AF_INET; + query.ai_family = AF_UNSPEC; query.ai_socktype = SOCK_STREAM; query.ai_protocol = IPPROTO_TCP; query.ai_flags = AI_ALL;