【发布时间】:2017-10-09 13:41:36
【问题描述】:
我正在尝试使用 libuv 将 URL 解析为 IP 地址。我正在使用函数uv_getaddrinfo,它将addrinfo 对象传递给我的回调。
这个回调是我收到 IP 地址的地方吗?如何从addrinfo 对象中提取 IP 地址?
【问题讨论】:
-
因为这是 C,所以它不是真正的“对象”,而是“结构”。这种差异可能看起来很学术,但从编程的角度来看它很重要。
我正在尝试使用 libuv 将 URL 解析为 IP 地址。我正在使用函数uv_getaddrinfo,它将addrinfo 对象传递给我的回调。
这个回调是我收到 IP 地址的地方吗?如何从addrinfo 对象中提取 IP 地址?
【问题讨论】:
utility functions 是针对此的,例如 uv_ipv4_addr 和 uv_ipv4_name,具体取决于您想要从该结构中打破什么。
许多 LibUV 函数直接采用 addrinfo,所以它是一个有用的结构。
libuv 提供uv_ipv4_name 和uv_ipv6_name。您选择的函数取决于您拥有的addrinfo 对象:
if (addrinfo.ai_family == AF_INET) {
// ipv4
char c[17] = { '\0' };
uv_ip4_name((sockaddr_in*)(addrinfo.ai_addr), c, 16);
std::cout << c << std::endl;
} else if (addrinfo.ai_family == AF_INET6) {
// ipv6
char c[40] = { '\0' };
uv_ip6_name((sockaddr_in6*)(addrinfo.ai_addr), c, 39);
std::cout << c << std::endl;
}
您可能会从 uv_getaddrinfo 获得多个 addrinfo 结构。这些存储在一个单链表中,其中“下一个”指针是addrinfo.ai_next。
这也很有帮助:What is the difference between struct addrinfo and struct sockaddr
【讨论】: