Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
1

sipcalc

16.05.2011, 03:21. Показов 1001. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан файл

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-[ipv4 : 192.168.1.2] - 0
 
[CIDR]
Host address        - 192.168.1.2
Host address (decimal)  - 3232235778
Host address (hex)  - C0A80102
Network address     - 192.168.1.2
Network mask        - 255.255.255.255
Network mask (bits) - 32
Network mask (hex)  - FFFFFFFF
Broadcast address   - 192.168.1.2
Cisco wildcard      - 0.0.0.0
Addresses in network    - 1
Network range       - 192.168.1.2 - 192.168.1.2
хотел его разбить на строки и прочитать с помощью "sscanf". Что бы например если задали параметр "Network mask (hex)" печатал FFFFFFFF. Подскажите если не трудно.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
16.05.2011, 07:17 2
читай через fgets()
разделяй через strtok()
сделай функцию strip() (удаляет символы по бокам)
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
16.05.2011, 20:48  [ТС] 3
спасиб за идею . а вот смотри как например отбросить лишние проблелы ?
Host address
Host address (decimal)

sscanf(line,"%s %s %s - %s",str,str1,str2,ip); пока читаю так , но как например счиатьб все даные до '-' ?

Добавлено через 2 часа 6 минут
сделай функцию strip() (удаляет символы по бокам)
не разобрался. подкинь плиз идею
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.05.2011, 02:14 4
функция strip()
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
 
void strip(char *s, char *chars);
 
int main(void)
{
    char s[] = " abcd ";
    
    strip(s, "da ");
    printf(".%s.\n", s);
    return 0;
}
 
void rstrip(char *s, char *chars);
void lstrip(char *s, char *chars);
 
void strip(char *s, char *chars)
{
    rstrip(s, chars);
    lstrip(s, chars);
}
 
#include <string.h>
 
void rstrip(char *s, char *chars)
{
    char *p;
    
    for (p = s; *p != '\0'; p++)
        ;
    while (p > s && strchr(chars, *(p - 1)) != NULL)
        p--;
    *p = '\0';
}
 
void lstrip(char *s, char *chars)
{
    size_t n;
    
    if ((n = strspn(s, chars)) > 0)
        memmove(s, s + n, strlen(s + n) + 1);
}
это в виде strip.c
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
29
30
31
32
33
 
#include <string.h>
 
void rstrip(char *s, char *chars);
void lstrip(char *s, char *chars);
 
/* strip: удаляет в s символы из chars по бокам */
void strip(char *s, char *chars)
{
    rstrip(s, chars);
    lstrip(s, chars);
}
 
/* strip: удаляет в s символы из chars справа */
void rstrip(char *s, char *chars)
{
    char *p;
    
    for (p = s; *p != '\0'; p++)
        ;
    while (p > s && strchr(chars, *(p - 1)) != NULL)
        p--;
    *p = '\0';
}
 
/* strip: удаляет в s символы из chars слева */
void lstrip(char *s, char *chars)
{
    size_t n;
    
    if ((n = strspn(s, chars)) > 0)
        memmove(s, s + n, strlen(s + n) + 1);
}
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
18.05.2011, 02:35  [ТС] 5
Спасибо изучим

Добавлено через 23 часа 10 минут
а вот смотри я переделал sipcalc как мне надо.

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
  FILE *fp;
  char str[128];
  char str1[128];
  char str2[128];
  char ip,ip1,ip2,ip3;
  char line[128];
 
  if((fp=fopen("/home/iWord/test.txt", "r"))==NULL) {
    printf("Не удается открыть файл.\n");
    exit(1);
  }
 
  while (fgets(line, sizeof line, fp) != NULL){
      sscanf(line,"%s",str);
      printf("%s ",str);
      
  }
 
  fclose(fp);
 
  return 0;
}
теперь он мне генерит такой файл
Network(decimal)- 255.255.255.16
Network(bits)- 11111111.11111111.11111111.00010000
Network(hex)- FFFFFF10
но вторую часть он почему то не хочет читать ip адреса . как быть тут?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.05.2011, 03:09 6
пробелы-то могут быть (файл конфигурационный)
C
1
2
    if (sscanf(line,"%[^-]-%[^\n]", first, second) == 2)
        printf("ok\n");
этот вариант неудобный, так как надо проверять длину каждого поля, чтобы не вызвать переполнение first и second, для этого надо формировать форматную строку до вызыва sscanf()
со strtok() проще, так как там просто указатели
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
18.05.2011, 06:12  [ТС] 7
спасибо за идею =). я ж дубень, переменную ip забыл как массив объявить...
0
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
23.05.2011, 19:53  [ТС] 8
А как мне заставить проглотить переменую system, что бы она мои данные выполняла?

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
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
  FILE *fp;
  char str[128];
  char str1[128];
  char str2[128];
  char ip[128],ip1,ip2,ip3;
  char line[128];
 
  
  //if (argc < 2){puts("Ошибка ввода используйте команду вида ./%s [маска подсети] [Формат вывода маски]");
    //            puts("Формат маски\n 10 - обычный вид ;\n 2 - двоичный вид ;\n 16 - шеснадцатеричный вид \n");
      //          exit(0);}
 
  system("sipcalc -i argv[1] >>test.txt");
  if((fp=fopen("test.txt", "r"))==NULL) {
    printf("Не удается открыть файл.\n");
    exit(0);
  }
 
  while (fgets(line, sizeof line, fp) != NULL){
      sscanf(line,"%[^-]-%[^\n]",str,ip);
      if(strcmp(str,argv[2])==NULL){
      printf("%s :",str);
      printf("% s \n",ip);
      }
  }
//   puts("Соотвествий не найдено");
  // puts("Формат маски Network(decimal) - обычный вид ; Network(bits) - двоичный вид ; Network(hex) - шеснадцатеричный вид");
 
  fclose(fp);
 
  return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.05.2011, 02:18 9
C
1
2
3
4
    char cmd[100];
 
    sprintf(cmd, "echo %d", 123);
    system(cmd);
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
24.05.2011, 02:20  [ТС] 10
спасибо ! понял
0
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
30.05.2011, 22:21  [ТС] 11
Черт пришлось переделать.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <stdlib.h>
#include <stdio.h>
 
void* memset(void *s, int c, size_t n)
{
    char* p = s;
    while(n--) *p++ = c;
    return s;
}
 
int main(int argc[],char *argv[])
{
  extern char     *__progname;
  int r,a,i,w[32],f[32],g[32],h[32],b,c,d;
  int t,y,u[32],o[32],p[32],x[32],z,v,m;
  
  if(argc<2) {printf("Ошибка ввода используйте команду ./%s [IP адрес в формате x.x.x.x] [Маска подстеи в формате y.y.y.y]\n",__progname);
        exit(0);}
  
  /*IP в двоичном виде*/
  sscanf(argv[1],"%d.%d.%d.%d",&a,&b,&c,&d);
 
  memset(w,0,sizeof(w));
  memset(f,0,sizeof(w));
  memset(g,0,sizeof(w));
  memset(h,0,sizeof(w));
 
  for(i=0;i<32;i++)
    {
      w[i]=((a>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      f[i]=((b>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      g[i]=((c>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      h[i]=((d>>i)&1);
      
    }
  
  printf("IP в двоичном виде ");
  for(i=31,r=0;i>=0;i--)
    { 
      if((w[i]==1)||(r==1))
    { 
      printf("%d",w[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((f[i]==1)||(r==1))
    { 
      printf("%d",f[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((g[i]==1)||(r==1))
    { 
      printf("%d",g[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((h[i]==1)||(r==1))
    { 
      printf("%d",h[i]);
      r=1;
    }
    }
    puts("");
    
    
  /*Маска подсети в двоичном виде*/
  sscanf(argv[2],"%d.%d.%d.%d",&y,&z,&v,&m);
 
  memset(o,0,sizeof(w));
  memset(u,0,sizeof(w));
  memset(p,0,sizeof(w));
  memset(x,0,sizeof(w));
 
  for(i=0;i<32;i++)
    {
      o[i]=((y>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      u[i]=((z>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      p[i]=((v>>i)&1);
      
    }
    for(i=0;i<32;i++)
    {
      x[i]=((m>>i)&1);
      
    }
  
  printf("Маска подсети в двоичном виде: ");
  for(i=31,r=0;i>=0;i--)
    { 
      if((o[i]==1)||(r==1))
    { 
      printf("%d",o[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((u[i]==1)||(r==1))
    { 
      printf("%d",u[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((p[i]==1)||(r==1))
    { 
      printf("%d",p[i]);
      r=1;
    }
    }
    printf(".");
    for(i=31,r=0;i>=0;i--)
    { 
      if((x[i]==1)||(r==1))
    { 
      printf("%d",x[i]);
      r=1;
    }
    }
 
  puts("");
  getchar();
  exit(0);
}
если используем
./rgr 192.168.1.1 255.255.255.0

IP в двоичном виде 11000000.10101000.1.1
Маска подсети в двоичном виде: 11111111.11111111.11111111.


как бы проглатывая нули. Как можно исправить. И если необходимо полное задание.
C
1
2
3
Вывести в командной строке IP адрес и маску.
Вывести 1)Номер сети 2)Номер узлов сети
 3)Значение маски в 16,2,10-ричном виде в зависимости от аргументов.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.05.2011, 02:28 12
memset() уже есть в стандартной библиотеке

Код
./rgr 192.168.1.1 255.255.255.0
нужно два массива
C
1
    unsigned char ipoct[4], mskoct[4];
0
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
31.05.2011, 02:47  [ТС] 13
а в эти массивы что записывать? только последнюю часть что ли?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.05.2011, 03:12 14
192
168
1
1

255
255
255
0

после этого массивы передаются в функции вывода, которые просто выводят их соответствующим образом
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
31.05.2011, 03:20  [ТС] 15
Можешь на примере пожалуйста? а то немного не понимаю.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.05.2011, 04:15 16
Вывести в командной строке IP адрес и маску.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
 
void print_ip(unsigned char oct[]);
void print_ip_hex(unsigned char oct[]);
int ip_from_str(unsigned char oct[], const char *s);
 
int main(void)
{
    unsigned char ipoct[4], mskoct[4];
    
    ip_from_str(ipoct, "192.168.1.1");
    ip_from_str(mskoct, "255.255.255.0");
    
    printf("ip: ");
    print_ip(ipoct);
    printf("msk: ");
    print_ip(mskoct);
    
    printf("ip hex: ");
    print_ip_hex(ipoct);
    
    return 0;
}
 
void print_ip(unsigned char oct[])
{
    printf("%d.%d.%d.%d\n", oct[0], oct[1], oct[2], oct[3]);
}
 
void print_ip_hex(unsigned char oct[])
{
    printf("%02X.%02X.%02X.%02X\n", oct[0], oct[1], oct[2], oct[3]);
}
 
int ip_from_str(unsigned char oct[], const char *s)
{
    int tmp[4], retval;
    
    retval = sscanf(s, "%d.%d.%d.%d",
                    tmp, tmp + 1, tmp + 2, tmp + 3);
    oct[0] = tmp[0];
    oct[1] = tmp[1];
    oct[2] = tmp[2];
    oct[3] = tmp[3];
    return retval == 4;
}
Код
[guest@localhost tests]$ ./t
ip: 192.168.1.1
msk: 255.255.255.0
ip hex: C0.A8.01.01
[guest@localhost tests]$
1
10 / 10 / 2
Регистрация: 21.12.2010
Сообщений: 108
31.05.2011, 10:36  [ТС] 17
Спасибо
0
31.05.2011, 10:36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru