網(wǎng)站策劃與運營課程認(rèn)知如何建網(wǎng)站詳細步驟
在Linux系統(tǒng)上用C++將主機名稱轉(zhuǎn)換為IPv4、IPv6地址
功能
指定一個std::string類型的主機名稱,函數(shù)解析主機名稱為IP地址,含IPv4和IPv6,解析結(jié)果以std::vector<std::string>類型返回。解析出錯或者解析失敗拋出std::string類型的異常消息。
源代碼?
以前隨便寫的一個解析域名為IP地址的功能現(xiàn)在需要支持IPv6,所以做了些調(diào)整。最后結(jié)果如下:
/*C++,將域名解析為IP地址(含IPv4和IPv6)
編譯: g++ -o main main.cpp
執(zhí)行:./main
效果:$ ./main
13.226.120.15
13.226.120.23
13.226.120.56
13.226.120.3
2600:9000:21e1:1200:1c:b3b0:7700:93a1
2600:9000:21e1:bc00:1c:b3b0:7700:93a1
2600:9000:21e1:9a00:1c:b3b0:7700:93a1
2600:9000:21e1:4e00:1c:b3b0:7700:93a1
2600:9000:21e1:a200:1c:b3b0:7700:93a1
2600:9000:21e1:3600:1c:b3b0:7700:93a1
2600:9000:21e1:1a00:1c:b3b0:7700:93a1
2600:9000:21e1:1800:1c:b3b0:7700:93a1*/// getaddrinfo, gai_strerror, freeaddrinfo
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>// inet_ntop
#include <arpa/inet.h>// strerror
#include <cstring>#include <string>
#include <vector>
#include <iostream>// 域名解析為IP地址,返回地址列表。
std::vector<std::string> hostToIPs(const std::string& host) {std::vector<std::string> addressList;addrinfo hints;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;hints.ai_protocol = 0;hints.ai_flags = 0;hints.ai_canonname = nullptr;hints.ai_addr = nullptr;hints.ai_next = nullptr;addrinfo* result = nullptr;auto res = getaddrinfo(host.c_str(), nullptr, &hints, &result);if (0 != res) {throw std::string(gai_strerror(res));}if (nullptr != result) {int bufferSize = 64;char buffer[64];void* pointer;for (auto rp = result; rp != nullptr; rp = rp->ai_next) {switch (rp->ai_family) {case AF_INET:pointer = (void*)&(((sockaddr_in*)(rp->ai_addr))->sin_addr);break;case AF_INET6:pointer = (void*)&(((sockaddr_in6*)(rp->ai_addr))->sin6_addr);break;default:continue;}if (nullptr == inet_ntop(rp->ai_family, pointer, buffer, bufferSize)) {freeaddrinfo(result);throw std::string("Run inet_ntop fail, errno is ") + std::to_string(errno)+ ", message: " + std::string(strerror(errno));}addressList.emplace_back(std::string(buffer));}freeaddrinfo(result);}if (addressList.size() <= 0) {throw std::string("address list is empty");}return addressList;
}int main() {try {for (const auto& address : hostToIPs("www.english.com")) {std::cout << address << std::endl;}} catch (const std::string& e) {std::cout << e << std::endl;}return 0;
}
運行截圖
程序在Ubuntu上開發(fā)調(diào)試,結(jié)果是OK的。解析結(jié)果支持IPv4和IPv6地址,主要參考材料是man手冊。運行截圖: