根据IP和掩码打印所有IP C++
Print all IPs based on IP and mask C++
我想打印给定掩码的所有可能的 IP。我有这个代码来获取它,但似乎我遗漏了一些东西,因为我无法获取 IP 列表。我的代码基于 this other post.
unsigned int ipaddress, subnetmask;
inet_pton(AF_INET, b->IpAddressList.IpAddress.String, &ipaddress);
inet_pton(AF_INET, b->IpAddressList.IpMask.String, &subnetmask);
for (unsigned int i = 1; i<(~subnetmask); i++) {
auto ip = ipaddress & (subnetmask + i);
}
示例:ip 地址= 172.22.0.65 网络掩码= 255.255.252.0
我预计:
172.22.0.1
172.22.0.2
172.22.0.3
172.22.0.4
...
更新:我试过这段代码,但还是不行:
char* ip = "172.22.0.65";
char* netmask = "255.255.252.0";
struct in_addr ipaddress, subnetmask;
inet_pton(AF_INET, ip, &ipaddress);
inet_pton(AF_INET, netmask, &subnetmask);
unsigned long first_ip = ntohl(ipaddress.s_addr & subnetmask.s_addr);
unsigned long last_ip = ntohl(ipaddress.s_addr | ~(subnetmask.s_addr));
for (unsigned long ip = first_ip; ip <= last_ip; ++ip) {
unsigned long theip = htonl(ip);
struct in_addr x = { theip };
printf("%s\n", inet_ntoa(x));
}
您正在 anding 具有子网掩码 added 的 IP 地址(本质上是 ored)与不断变化的主机部分。这里的优先级是错误的。您应该 and 带有网络掩码的 IP 地址以获得 network 部分,然后 or那里的主机部分:
auto ip = (ipaddress & subnetmask) | i;
此外,inet_pton
的结果不是 int
,而是 struct in_addr
,所以无论如何 YMMV。最有可能的是,您应该使用 inet_addr
而不是 returns 和 uint32_t
:
ip_address = inet_addr("127.0.0.1");
但是你的代码再次期望 127
是最重要的字节,它不在 LSB 系统上。因此,您需要将这些地址与 ntohl
交换一次,然后再与 htonl
.
交换
因此我们得到类似的东西:
uint32_t ipaddress;
uint32_t subnetmask;
ipaddress = ntohl(inet_addr(b->IpAddressList.IpAddress.String));
subnetmask = ntohl(inet_addr(b->IpAddressList.IpMask.String));
for (uint32_t i = 1; i<(~subnetmask); i++) {
uint32_t ip = (ipaddress & subnetmask) | i;
struct in_addr x = { htonl(ip) };
printf("%s\n", inet_ntoa(x));
}
您可以按位 AND
输入 IP 地址和输入掩码来确定范围内的第一个 IP,并按位 OR
输入 IP 地址和掩码的倒数来确定范围内的第一个 IP范围内的最后一个 IP。然后你可以遍历它们之间的值。
此外,inet_pton(AF_INET)
需要指向 struct in_addr
的指针,而不是 unsigned int
。
试试这个:
struct in_addr ipaddress, subnetmask;
inet_pton(AF_INET, b->IpAddressList.IpAddress.String, &ipaddress);
inet_pton(AF_INET, b->IpAddressList.IpMask.String, &subnetmask);
unsigned long first_ip = ntohl(ipaddress.s_addr & subnetmask.s_addr);
unsigned long last_ip = ntohl(ipaddress.s_addr | ~(subnetmask.s_addr));
for (unsigned long ip = first_ip; ip <= last_ip; ++ip) {
unsigned long theip = htonl(ip);
// use theip as needed...
}
例如:
172.22.0.65 & 255.255.252.0 = 172.22.0.0
172.22.0.65 | 0.0.3.255 = 172.22.3.255
我想打印给定掩码的所有可能的 IP。我有这个代码来获取它,但似乎我遗漏了一些东西,因为我无法获取 IP 列表。我的代码基于 this other post.
unsigned int ipaddress, subnetmask;
inet_pton(AF_INET, b->IpAddressList.IpAddress.String, &ipaddress);
inet_pton(AF_INET, b->IpAddressList.IpMask.String, &subnetmask);
for (unsigned int i = 1; i<(~subnetmask); i++) {
auto ip = ipaddress & (subnetmask + i);
}
示例:ip 地址= 172.22.0.65 网络掩码= 255.255.252.0
我预计:
172.22.0.1 172.22.0.2 172.22.0.3 172.22.0.4 ...
更新:我试过这段代码,但还是不行:
char* ip = "172.22.0.65";
char* netmask = "255.255.252.0";
struct in_addr ipaddress, subnetmask;
inet_pton(AF_INET, ip, &ipaddress);
inet_pton(AF_INET, netmask, &subnetmask);
unsigned long first_ip = ntohl(ipaddress.s_addr & subnetmask.s_addr);
unsigned long last_ip = ntohl(ipaddress.s_addr | ~(subnetmask.s_addr));
for (unsigned long ip = first_ip; ip <= last_ip; ++ip) {
unsigned long theip = htonl(ip);
struct in_addr x = { theip };
printf("%s\n", inet_ntoa(x));
}
您正在 anding 具有子网掩码 added 的 IP 地址(本质上是 ored)与不断变化的主机部分。这里的优先级是错误的。您应该 and 带有网络掩码的 IP 地址以获得 network 部分,然后 or那里的主机部分:
auto ip = (ipaddress & subnetmask) | i;
此外,inet_pton
的结果不是 int
,而是 struct in_addr
,所以无论如何 YMMV。最有可能的是,您应该使用 inet_addr
而不是 returns 和 uint32_t
:
ip_address = inet_addr("127.0.0.1");
但是你的代码再次期望 127
是最重要的字节,它不在 LSB 系统上。因此,您需要将这些地址与 ntohl
交换一次,然后再与 htonl
.
因此我们得到类似的东西:
uint32_t ipaddress;
uint32_t subnetmask;
ipaddress = ntohl(inet_addr(b->IpAddressList.IpAddress.String));
subnetmask = ntohl(inet_addr(b->IpAddressList.IpMask.String));
for (uint32_t i = 1; i<(~subnetmask); i++) {
uint32_t ip = (ipaddress & subnetmask) | i;
struct in_addr x = { htonl(ip) };
printf("%s\n", inet_ntoa(x));
}
您可以按位 AND
输入 IP 地址和输入掩码来确定范围内的第一个 IP,并按位 OR
输入 IP 地址和掩码的倒数来确定范围内的第一个 IP范围内的最后一个 IP。然后你可以遍历它们之间的值。
此外,inet_pton(AF_INET)
需要指向 struct in_addr
的指针,而不是 unsigned int
。
试试这个:
struct in_addr ipaddress, subnetmask;
inet_pton(AF_INET, b->IpAddressList.IpAddress.String, &ipaddress);
inet_pton(AF_INET, b->IpAddressList.IpMask.String, &subnetmask);
unsigned long first_ip = ntohl(ipaddress.s_addr & subnetmask.s_addr);
unsigned long last_ip = ntohl(ipaddress.s_addr | ~(subnetmask.s_addr));
for (unsigned long ip = first_ip; ip <= last_ip; ++ip) {
unsigned long theip = htonl(ip);
// use theip as needed...
}
例如:
172.22.0.65 & 255.255.252.0 = 172.22.0.0
172.22.0.65 | 0.0.3.255 = 172.22.3.255