Всем привет! Написал небольшой скрипт для перебора ip заданного диапазона, но работает он не правильно, помогите подправить. Code: #include <netinet/in.h> #include <iostream> #include <string> #include <arpa/inet.h> using namespace std; int main() { struct sockaddr_in addr; char start_ip[] = "62.80.160.0"; char end_ip[] = "62.80.160.255"; for(unsigned long i = inet_addr(start_ip); i <= inet_addr(end_ip); i += inet_addr("0.0.0.1")) { addr.sin_addr.s_addr = i; printf("%s\n",inet_ntoa(addr.sin_addr)); } return 0; }
Попробуй что-нибудь типа Code: char start_ip[] = "127.0.0.1"; char end_ip[] = "127.0.1.5"; for(unsigned long i = htonl(inet_addr(start_ip)), j = htonl(inet_addr(end_ip)); i <= j; i++) { printf("%u.%u.%u.%u\n", (i>>24) & 0xFF, (i>>16) & 0xFF, (i>>8) & 0xFF, i & 0xFF); }
если вы пишете на плюсах - зачем вам printf? разве не удобнее для вывода использовать объект cout? хотя какой тут удобнее, правильнее!
если говорить об удобстве не смотря на идеологическую правильность то мне кажется cout намного менее удобно чем printf вот например в MFC есть класс CString у него мембер для форматированной записи Format именно в си стиле а не перегружен какой нибудь >> мне кажется именно потому что это крайне неудобно у меня пальцы привыкли набирать строку формата си стайла автоматически а в >> монструозные конструкции если сразу учил с++ и привык к >> то возможно оно и кажется удобнее но после си стайла оно кажется костылем это факт
TС, самая грубая ошибка в твоем коде то, что ты работаешь с IP как с массивом char, т.е. с текстом, а IP адрес это номер, 32 битное число. Работай с бинарными операторами и с числом unsigned int.
а вот и победитель специальной олимпиады. Code: #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { if (argc != 3) return 1; in_addr_t start = inet_network(argv[1]); if (start == -1) return 1; in_addr_t end = inet_network(argv[2]); if (end == -1) return 1; for (; start <= end; start++) { struct in_addr addr; addr.s_addr = htonl(start); printf("%s\n", inet_ntoa(addr)); } return 0; }
Code: for (; start <= end; start++) { struct in_addr addr; addr.s_addr = htonl(start); printf("%s\n", inet_ntoa(addr)); } зачем объявлять объект структуры на каждой итерации цикла?
я использовал трансляцию из big endian(network order) в little endian и обратно, причем очень удобно для арифметики диапазонов. Code: ULONG NetId(ULONG ip, ULONG mask) { return (ip & mask); } ULONG NetGetCIDRValue(ULONG mask) { ULONG rc = 0; mask = htonl(mask); while (!(mask & 1)) { mask >>= 1; rc++; } return(32 - rc); } ULONG NetFirstHost(ULONG ip, ULONG mask) { return htonl((htonl(ip & mask) + 1)); } ULONG NetLastHost(ULONG ip, ULONG mask) { return htonl(htonl(NetFirstHost(ip, mask)) + htonl(~mask) - 2); } // exclude net id and broadcast ULONG NetNumHosts(ULONG ip, ULONG mask) { return (htonl(NetLastHost(ip, mask)) - htonl(NetFirstHost(ip, mask))) + 1; }