--- 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;