Форум программистов, компьютерный форум CyberForum.ru

Калькулятор IP - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
05.10.2009, 20:21     Калькулятор IP #1
Нужно написать программку, которая обрабатывает значения ip и маски, и выводит информацию (число сетей, узлов и т.д.). В связи с небольшим опытом программирования, не знаю как интерпретировать ip на языке, не знаю как записать и где сохранить. Какие могут быть варианты, с учетом более удобной дальнейшей работы с адресом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2009, 20:21     Калькулятор IP
Посмотрите здесь:

Калькулятор на С++ C++
C++ Калькулятор на С
C++ Калькулятор
Калькулятор C++
Калькулятор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
05.10.2009, 21:23     Калькулятор IP #2
А разбиения на логические подсети надо учитывать?
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.10.2009, 22:23     Калькулятор IP #3
Lorr, выучи класс csocet
minitup
1 / 1 / 0
Регистрация: 27.09.2009
Сообщений: 8
06.10.2009, 00:00     Калькулятор IP #4
Че его интерпретировать-то? http://ru.wikipedia.org/wiki/Маска_подсети

Чтобы получить адрес сети, зная IP-адрес и маску подсети, необходимо применить к ним операцию поразрядной конъюнкции (логическое И).

IP-адрес: 11000000 10101000 00000001 00000010 (192.168.1.2)
Маска подсети: 11111111 11111111 11111111 00000000 (255.255.255.0)
Адрес сети: 11000000 10101000 00000001 00000000 (192.168.1.0)
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.10.2009, 05:33     Калькулятор IP #5
Цитата Сообщение от Lorr
не знаю как записать и где сохранить
адрес занимает четыре байта, поэтому хранить можно в переменной типа unsigned long
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
06.10.2009, 20:58     Калькулятор IP #6
Есть еще IPv6 - там адрес занимает 16 байт.
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
11.10.2009, 20:16  [ТС]     Калькулятор IP #7
Цитата Сообщение от odip Посмотреть сообщение
Есть еще IPv6 - там адрес занимает 16 байт.
Ну 6-я версия IP была успешно разработана и так же успешно положена на полку.
Так что нет необходимости обеспечивать функционал для поддрежки этого стандарта
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
11.10.2009, 20:18     Калькулятор IP #8
6-я версия IP была успешно разработана и так же успешно положена на полку
Ничего подобного.
До сих пор допиливают
Vista/2008/Windows7 по умолчанию имеют включенный IPv6
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
11.10.2009, 20:28  [ТС]     Калькулятор IP #9
Цитата Сообщение от odip Посмотреть сообщение
Ничего подобного.
До сих пор допиливают
Vista/2008/Windows7 по умолчанию имеют включенный IPv6
Вот только не видно, что кто-то сильно его использует. Долго переходить будут, если вообще будут.

Добавлено через 3 минуты
Цитата Сообщение от minitup Посмотреть сообщение
Че его интерпретировать-то? http://ru.wikipedia.org/wiki/Маска_подсети

Чтобы получить адрес сети, зная IP-адрес и маску подсети, необходимо применить к ним операцию поразрядной конъюнкции (логическое И).

IP-адрес: 11000000 10101000 00000001 00000010 (192.168.1.2)
Маска подсети: 11111111 11111111 11111111 00000000 (255.255.255.0)
Адрес сети: 11000000 10101000 00000001 00000000 (192.168.1.0)
Да дело не в этом. По сути машине безразлично, в каком виде хранятся данные...
Я спрашиваю, как реализовать работу алгоритма в консоле:
1) Ввод IP в виде 192.168.26.132.
2) Нажимаем enter, данные куда-то записались
Как игнорировать точки ?
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
11.10.2009, 20:31     Калькулятор IP #10
Я спрашиваю, как реализовать работу алгоритма в консоле:
Выделить и пропарсить 4 числа.
Например можно использовать функцию strtol().
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
11.10.2009, 20:38  [ТС]     Калькулятор IP #11
а нельзя более подробно пример ?
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
11.10.2009, 20:44     Калькулятор IP #12
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char buf[100], *ptr;
int d0,d1,d2,d3;
 
strcpy( buf, "1.2.3.4" );
ptr= &buf[0];
d0= strtol( ptr, &endptr, 10 );
// обработка ошибок
ptr= endptr;
if ( ptr != '.' ) { // обработка ошибок
}
ptr++;
d1= strtol( ptr, &endptr, 10 );
// обработка ошибок
ptr= endptr;
if ( ptr != '.' ) { // обработка ошибок
}
ptr++;
d2= strtol( ptr, &endptr, 10 );
// обработка ошибок
ptr= endptr;
if ( ptr != '.' ) { // обработка ошибок
}
ptr++;
d3= strtol( ptr, &endptr, 10 );
// обработка ошибок
ptr= endptr;
if ( ptr != '\0' ) { // обработка ошибок
}
Добавлено через 2 минуты
Еще есть функции конвертации: inet_ntoa(), inet_aton()
Которые делают именно то что нужно
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.10.2009, 02:11     Калькулятор IP #13
Цитата Сообщение от Lorr
1) Ввод IP в виде 192.168.26.132.
2) Нажимаем enter, данные куда-то записались
C
1
2
3
4
5
    int a, b, c, d;
    char *addr = "127.0.0.1";
 
    if (sscanf(addr, "%d.%d.%d.%d", &a, &b, &c, &d) != 4)
        return 1;
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 16:26  [ТС]     Калькулятор IP #14
Цитата Сообщение от accept Посмотреть сообщение
C
1
2
3
4
5
    int a, b, c, d;
    char *addr = "127.0.0.1";
 
    if (sscanf(addr, "%d.%d.%d.%d", &a, &b, &c, &d) != 4)
        return 1;
a,b,c,d - 4 переменных для четырех актетов IP-адреса - это понятно...
А строка
C
1
 char *addr = "127.0.0.1";
что делает? Объявляет указатель на тип char. Но резервируется же область памяти 1 бай, как можно инициализировать строкой "127.0.0.1" ? Или я что то недопонял?

А вот этот кусок вообще непонятен
C
1
2
  if (sscanf(addr, "%d.%d.%d.%d", &a, &b, &c, &d) != 4)
        return 1;
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
12.10.2009, 16:32     Калькулятор IP #15
Используй inet_ntoa(), inet_aton()
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 16:39  [ТС]     Калькулятор IP #16
Цитата Сообщение от odip Посмотреть сообщение
Выделить и пропарсить 4 числа.
Например можно использовать функцию strtol().
long int strtol ( const char * str, char ** endptr, int base );
Это прототип функции. Т.е. как я понял, получает функция три параметра
str - указатель на нашу стркоу
endptr - указатель на символ, который считается концом строки ? Почему ти идет как указатель на указатель на char ?
base - параметр, определяющий систему исчисления ?

Что не так понял ?

Добавлено через 56 секунд
Цитата Сообщение от odip Посмотреть сообщение
Используй inet_ntoa(), inet_aton()
Я просто разобраться хочу в работе функций
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
12.10.2009, 16:57     Калькулятор IP #17
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 17:28  [ТС]     Калькулятор IP #18
Цитата Сообщение от odip Посмотреть сообщение
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
Dev и VS8 без help'a

Нашел описание, как работает в общих чертах понял (strtol);
В описании пример был, не понял один момент.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}
При запуске программы, создается строка и указатель на char и четыре переменных, которым будут присвоены результаты работы функции strtol.
Встроке
li1 = strtol (szNumbers,&pEnd,10); функции передается строка символов, которую необходимо интерпретировать в число, указатель, по адресу в котором запишется символ, на котором остановлено преобразование строки, и идентификатор системы исчисления.
li2 = strtol (pEnd,&pEnd,16); но почему в этой строке в качестве строки с символами, которые нужно интерпретировать в число, передается по сути символ, на котором было остановлено преобразование в первый вызов функции ?
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
12.10.2009, 18:27     Калькулятор IP #19
http://opennet.ru/man.shtml?topic=st...ry=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Добавлено через 41 секунду
А вообще быстрее может быть inet_aton() использовать.
Или вообще написать свой парсер без strtol()

Добавлено через 8 минут
Dev и VS8 без help'a
К Visual Studio 2008 скачай MSDN help.

В Internet полно документации.

А как ты программы пишешь, если ни одной функции не знаешь ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2009, 19:57     Калькулятор IP
Еще ссылки по теме:

Калькулятор C++
Калькулятор C++
Простой калькулятор и калькулятор с парсингом C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Lorr
 Аватар для Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 19:57  [ТС]     Калькулятор IP #20
Цитата Сообщение от odip Посмотреть сообщение

А как ты программы пишешь, если ни одной функции не знаешь ?
Плохо пишу =(

Добавлено через 27 минут
Цитата Сообщение от odip Посмотреть сообщение
http://opennet.ru/man.shtml?topic=st...ry=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Сори за настырность, но объясните почему приведенный мой вариант из описания не верный...
Yandex
Объявления
12.10.2009, 19:57     Калькулятор IP
Ответ Создать тему
Опции темы

Текущее время: 01:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru