打印网络掩码
Printing out netmask
我一直在编写一个程序来列出我计算机的所有 IP 地址、网络掩码和接口名称,但我 运行 在打印网络掩码时遇到了问题。这个问题似乎只发生在 IPv6 上。这是代码:
int i;
struct ifaddrs *ifap, *ifa;
getifaddrs(&ifap);
char *net_mask = NULL;
int buffer_size = 200;
char *ifa_addr = NULL;
for (ifa = ifap; ifa; ifa = ifa->ifa_next)
{
struct sockaddr_in *ifan = (struct sockaddr_in *) ifa->ifa_netmask; //interface netmask
struct sockaddr_in *ifaa_in = (struct sockaddr_in*)ifa->ifa_addr; //interface address
//same as above with the exception that it is for ipv6
struct sockaddr_in6 *ifan6 = (struct sockaddr_in6 *) ifa->ifa_netmask;
struct sockaddr_in6 *ifaa_in6 = (struct sockaddr_in6*)ifa->ifa_addr;
char *prevNet_mask = net_mask;
net_mask = (char*)calloc(buffer_size, sizeof(char*));
ifa_addr = (char*)calloc(buffer_size, sizeof(char*));
inet_ntop(ifa->ifa_addr->sa_family,ifa->ifa_addr->sa_family == AF_INET?(void*)&ifan->sin_addr : (void*)&ifan6->sin6_addr, net_mask, buffer_size);
inet_ntop(ifa->ifa_addr->sa_family, ifa->ifa_addr->sa_family == AF_INET?(void*)&ifaa_in->sin_addr: (void*)&ifaa_in6->sin6_addr ,ifa_addr , buffer_size);
printf("Interface: %s\tNetMask: %s", ifa->ifa_name, net_mask);
//space evenly
int num_spaces = strlen(net_mask) - 40;
if(num_spaces < 0) num_spaces *= -1;
for(i = 0; i <num_spaces;i++) printf(" ");
printf("Address: %s\n",ifa_addr);
}
这是我的输出:
Interface: {BE3A9EA6-72AB-40FD-9036-9AC6BA4D75CF} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::9cfb:3ebd:d866:e214
Interface: {BE3A9EA6-72AB-40FD-9036-9AC6BA4D75CF} NetMask: 255.255.0.0 Address: 169.254.226.20
Interface: {AA4D555F-C490-40DE-9F61-8E5AB3252389} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::e994:389a:9ab4:1e45
Interface: {AA4D555F-C490-40DE-9F61-8E5AB3252389} NetMask: 255.255.0.0 Address: 169.254.30.69
Interface: {E1AE93D7-66CC-4651-A470-1445CC777F36} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::5837:88eb:5801:273e
Interface: {E1AE93D7-66CC-4651-A470-1445CC777F36} NetMask: 255.255.0.0 Address: 169.254.39.62
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: 2602:306:8390:10f0::43
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:: Address: 2602:306:8390:10f0:6810:b0eb:1287:3138
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: 2602:306:8390:10f0:116d:50d0:4291:c8ab
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::6810:b0eb:1287:3138
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: 255.255.255.0 Address: 192.168.1.70
Interface: {D301A0B1-F567-11E5-A797-806E6F6E6963} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: ::1
Interface: {D301A0B1-F567-11E5-A797-806E6F6E6963} NetMask: 255.0.0.0 Address: 127.0.0.1
Interface: {01CEB8B7-97FE-40AC-A5D4-47A61834A467} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: fe80::5efe:c0a8:146
Interface: {4ED4A6C1-0496-4F0B-AD77-395C9F275D41} NetMask: ffff:ffff:ffff:ffff:: Address: 2001:0:9d38:90d7:2c9a:771:97c6:fef0
Interface: {4ED4A6C1-0496-4F0B-AD77-395C9F275D41} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::2c9a:771:97c6:fef0
Interface: {A8CF5839-BA78-4C69-865E-3BE15F9F9A2C} NetMask: 0.0.0.0 Address: 0.0.0.0
似乎某些接口的 ipv6 网络掩码不完整。谁能解释一下这是为什么?
网络掩码并非不完整,双冒号表示一个或多个连续的零块。
我一直在编写一个程序来列出我计算机的所有 IP 地址、网络掩码和接口名称,但我 运行 在打印网络掩码时遇到了问题。这个问题似乎只发生在 IPv6 上。这是代码:
int i;
struct ifaddrs *ifap, *ifa;
getifaddrs(&ifap);
char *net_mask = NULL;
int buffer_size = 200;
char *ifa_addr = NULL;
for (ifa = ifap; ifa; ifa = ifa->ifa_next)
{
struct sockaddr_in *ifan = (struct sockaddr_in *) ifa->ifa_netmask; //interface netmask
struct sockaddr_in *ifaa_in = (struct sockaddr_in*)ifa->ifa_addr; //interface address
//same as above with the exception that it is for ipv6
struct sockaddr_in6 *ifan6 = (struct sockaddr_in6 *) ifa->ifa_netmask;
struct sockaddr_in6 *ifaa_in6 = (struct sockaddr_in6*)ifa->ifa_addr;
char *prevNet_mask = net_mask;
net_mask = (char*)calloc(buffer_size, sizeof(char*));
ifa_addr = (char*)calloc(buffer_size, sizeof(char*));
inet_ntop(ifa->ifa_addr->sa_family,ifa->ifa_addr->sa_family == AF_INET?(void*)&ifan->sin_addr : (void*)&ifan6->sin6_addr, net_mask, buffer_size);
inet_ntop(ifa->ifa_addr->sa_family, ifa->ifa_addr->sa_family == AF_INET?(void*)&ifaa_in->sin_addr: (void*)&ifaa_in6->sin6_addr ,ifa_addr , buffer_size);
printf("Interface: %s\tNetMask: %s", ifa->ifa_name, net_mask);
//space evenly
int num_spaces = strlen(net_mask) - 40;
if(num_spaces < 0) num_spaces *= -1;
for(i = 0; i <num_spaces;i++) printf(" ");
printf("Address: %s\n",ifa_addr);
}
这是我的输出:
Interface: {BE3A9EA6-72AB-40FD-9036-9AC6BA4D75CF} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::9cfb:3ebd:d866:e214
Interface: {BE3A9EA6-72AB-40FD-9036-9AC6BA4D75CF} NetMask: 255.255.0.0 Address: 169.254.226.20
Interface: {AA4D555F-C490-40DE-9F61-8E5AB3252389} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::e994:389a:9ab4:1e45
Interface: {AA4D555F-C490-40DE-9F61-8E5AB3252389} NetMask: 255.255.0.0 Address: 169.254.30.69
Interface: {E1AE93D7-66CC-4651-A470-1445CC777F36} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::5837:88eb:5801:273e
Interface: {E1AE93D7-66CC-4651-A470-1445CC777F36} NetMask: 255.255.0.0 Address: 169.254.39.62
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: 2602:306:8390:10f0::43
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:: Address: 2602:306:8390:10f0:6810:b0eb:1287:3138
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: 2602:306:8390:10f0:116d:50d0:4291:c8ab
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::6810:b0eb:1287:3138
Interface: {A251C284-7DC3-4F56-AB6A-8A4E4E218B6F} NetMask: 255.255.255.0 Address: 192.168.1.70
Interface: {D301A0B1-F567-11E5-A797-806E6F6E6963} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: ::1
Interface: {D301A0B1-F567-11E5-A797-806E6F6E6963} NetMask: 255.0.0.0 Address: 127.0.0.1
Interface: {01CEB8B7-97FE-40AC-A5D4-47A61834A467} NetMask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Address: fe80::5efe:c0a8:146
Interface: {4ED4A6C1-0496-4F0B-AD77-395C9F275D41} NetMask: ffff:ffff:ffff:ffff:: Address: 2001:0:9d38:90d7:2c9a:771:97c6:fef0
Interface: {4ED4A6C1-0496-4F0B-AD77-395C9F275D41} NetMask: ffff:ffff:ffff:ffff:: Address: fe80::2c9a:771:97c6:fef0
Interface: {A8CF5839-BA78-4C69-865E-3BE15F9F9A2C} NetMask: 0.0.0.0 Address: 0.0.0.0
似乎某些接口的 ipv6 网络掩码不完整。谁能解释一下这是为什么?
网络掩码并非不完整,双冒号表示一个或多个连续的零块。