C++ перебор ip.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by maxfax, 4 Jul 2011.

  1. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    Всем привет!

    Написал небольшой скрипт для перебора 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;
    }
    
     
  2. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Попробуй что-нибудь типа
    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);
    	}
    
     
  3. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    С PHP на плюсы пересел?
     
  4. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    да, решил попробовать.
     
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    если вы пишете на плюсах - зачем вам printf?
    разве не удобнее для вывода использовать объект cout?
    хотя какой тут удобнее, правильнее!
     
  6. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    вы правы, спасибо!
     
  7. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    в принципе разницы большой нет=)
    вот я например привык к форматированному выводу...
     
  8. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    принтф - это си стайл, что не есть гуд в с++.
     
  9. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    если говорить об удобстве не смотря на идеологическую правильность то мне кажется cout намного менее удобно чем printf вот например в MFC есть класс CString у него мембер для форматированной записи Format именно в си стиле а не перегружен какой нибудь >> мне кажется именно потому что это крайне неудобно у меня пальцы привыкли набирать строку формата си стайла автоматически а в >> монструозные конструкции если сразу учил с++ и привык к >> то возможно оно и кажется удобнее но после си стайла оно кажется костылем это факт
     
  10. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    TС, самая грубая ошибка в твоем коде то, что ты работаешь с IP как с массивом char, т.е. с текстом, а IP адрес это номер, 32 битное число.
    Работай с бинарными операторами и с числом unsigned int.
     
  11. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    а вот и победитель специальной олимпиады.
    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;
    }
    
     
  12. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Code:
        for (; start <= end; start++)
        {
            struct in_addr addr;
            addr.s_addr = htonl(start);
            printf("%s\n", inet_ntoa(addr));
        }
    зачем объявлять объект структуры на каждой итерации цикла? :)
     
  13. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    У тебя пехопе головного мозга.
     
  14. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    все же потрудитесь ответить на вопрос.
     
  15. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Затем, что эта структура не нужна в глобальной области видимости функции.
     
  16. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    спасибо, понял уже!
     
  17. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    я использовал трансляцию из 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;
    }