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

sipcalc - C++

Восстановить пароль Регистрация
 
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
16.05.2011, 03:21     sipcalc #1
Дан файл

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. Подскажите если не трудно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.05.2011, 07:17     sipcalc #2
читай через fgets()
разделяй через strtok()
сделай функцию strip() (удаляет символы по бокам)
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
16.05.2011, 20:48  [ТС]     sipcalc #3
спасиб за идею . а вот смотри как например отбросить лишние проблелы ?
Host address
Host address (decimal)

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

Добавлено через 2 часа 6 минут
сделай функцию strip() (удаляет символы по бокам)
не разобрался. подкинь плиз идею
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.05.2011, 02:14     sipcalc #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);
}
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
18.05.2011, 02:35  [ТС]     sipcalc #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 адреса . как быть тут?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.05.2011, 03:09     sipcalc #6
пробелы-то могут быть (файл конфигурационный)
C
1
2
    if (sscanf(line,"%[^-]-%[^\n]", first, second) == 2)
        printf("ok\n");
этот вариант неудобный, так как надо проверять длину каждого поля, чтобы не вызвать переполнение first и second, для этого надо формировать форматную строку до вызыва sscanf()
со strtok() проще, так как там просто указатели
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
18.05.2011, 06:12  [ТС]     sipcalc #7
спасибо за идею =). я ж дубень, переменную ip забыл как массив объявить...
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
23.05.2011, 19:53  [ТС]     sipcalc #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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.05.2011, 02:18     sipcalc #9
C
1
2
3
4
    char cmd[100];
 
    sprintf(cmd, "echo %d", 123);
    system(cmd);
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
24.05.2011, 02:20  [ТС]     sipcalc #10
спасибо ! понял
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
30.05.2011, 22:21  [ТС]     sipcalc #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-ричном виде в зависимости от аргументов.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.05.2011, 02:28     sipcalc #12
memset() уже есть в стандартной библиотеке

Код
./rgr 192.168.1.1 255.255.255.0
нужно два массива
C
1
    unsigned char ipoct[4], mskoct[4];
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
31.05.2011, 02:47  [ТС]     sipcalc #13
а в эти массивы что записывать? только последнюю часть что ли?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.05.2011, 03:12     sipcalc #14
192
168
1
1

255
255
255
0

после этого массивы передаются в функции вывода, которые просто выводят их соответствующим образом
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
31.05.2011, 03:20  [ТС]     sipcalc #15
Можешь на примере пожалуйста? а то немного не понимаю.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.05.2011, 04:15     sipcalc #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]$
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
31.05.2011, 10:36  [ТС]     sipcalc #17
Спасибо
Yandex
Объявления
31.05.2011, 10:36     sipcalc
Ответ Создать тему
Опции темы

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