сетевое программирование — печать всех IP-адресов на основе IP-адреса и маски переполнения стека

Я хотел бы напечатать все возможные IP-адреса для данной маски. У меня есть этот код, чтобы получить его, но, похоже, я что-то упустил, так как не могу получить список IP-адресов. Я основал свой код в этот другой пост.

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);
}

Пример: ipaddress = 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));
}

0

Решение

Вы можете поразрядно AND входной IP-адрес с маской ввода для определения первого IP-адреса в диапазоне и поразрядно OR входной 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
2

Другие решения

Вы Андинг IP-адрес с маской подсети добавленной (по существу ored) с изменяющейся частью хоста. Приоритет здесь неправильный. Вы должны а также IP-адрес с сетевой маской, чтобы получить сеть часть, то или же принимающая часть там:

auto ip = (ipaddress & subnetmask) | i;

Кроме того, результат inet_pton это не int но struct in_addr так что YMMV в любом случае. Скорее всего, вы должны использовать inet_addr вместо этого, как он возвращает 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));
}
3

По вопросам рекламы [email protected]