Cla*_*dix 2 linux network-programming loopback ipv6 getaddrinfo
我开始了解 IPv6 并且我读到可以使用::ffff:前缀将 IPv4 地址映射到 IPv6 。这使我想到地址是否::ffff:127.0.0.1是指localhost,所以我写了一个简单的C程序,用途getaddrinfo()和IN6_IS_ADDR_LOOPBACK宏检查是否返回的地址是环回。
我已经用::1环回地址的其他变体测试了该程序,正如预期的那样,该程序说它是环回。但是,令我惊讶的是,当我尝试::ffff:127.0.0.1该程序时,它说不是!这怎么可能?我错过了什么吗?
这是我的程序源代码的简化版本:
struct addrinfo hints, *servinfo;
int rv;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;
/* hostname_or_ip is entered from the command line */
if ( (rv = getaddrinfo(hostname_or_ip, NULL, &hints, &servinfo)) != 0) {
exit(1);
}
struct addrinfo *p = servinfo;
struct sockaddr_in6 *h = (struct sockaddr_in6 *) p->ai_addr;
int is_loopback = IN6_IS_ADDR_LOOPBACK(&h->sin6_addr) ? 1 : 0;
printf("%s\n", is_loopback ? "YES!" : "NO!");
Run Code Online (Sandbox Code Playgroud)
如果您接受 IPv6 套接字上的传入 IPv4 连接,则必须将 IPv4 地址填充为 128 位。这是通过预先完成的::ffff:。所以你看到的是 IPv4 环回地址。
当检查地址是否为 IPv6 环回地址时,答案是否定的,因为::1是 IPv6 环回地址。您看到的地址被归类为 IPv4 映射的 IPv6 地址。映射的 IPv4 地址恰好是 IPv4 环回地址,但从 IPv6 堆栈的角度来看,它只是一个映射地址。
| 归档时间: |
|
| 查看次数: |
5391 次 |
| 最近记录: |