AddressInfos [] = addrinfo& v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Fri, 05 Aug 2022 23:45:48 +0200
branchv_0
changeset 12 fcc5ed0fab9f
parent 11 a910051cd975
child 13 c29b13a659a7
AddressInfos [] = addrinfo&
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;