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

Расчитать маскку сети исходя из диапозона - Objective-C

Войти
Регистрация
Восстановить пароль
 
vikewoods
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 7
05.10.2013, 13:41     Расчитать маскку сети исходя из диапозона #1
Добрый день Господа!

Никак не могу понять как же считается маска сети зная ее Network & Broadcast IP's и как это можно сделать в Objective C

Я новичек в Objective C... Пока что накидал вот такое:

Objective-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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//
//  IPCalculator.m
//  IP Network Calculator
//
//  Created by Vik Ewoods on 10/2/13.
//  Copyright (c) 2013 Vik Ewoods. All rights reserved.
//
 
#import "IPCalculator.h"
 
@implementation IPCalculator
 
// Classes Table
// Class    First Bit   Min IP      Max IP            Hosts
// A        0           1.0.0.0     126.0.0.1         2^24
// B        10          128.0.0.0   191.255.0.0       2^16
// C        110         192.0.1.0   223.255.255.0     2^8
// D        1110        224.0.0.0   239.255.255.255   Multicast
// E        11110       240.0.0.0   247.255.255.255   Reserved
 
// NOTES: CIDR -> Conver bits from 00000001 to 10000000
// NOTES: HOST -> (2^32-CIDR) - 2;
 
-(int)getCIDRprefixByMask:(NSString *)mask{
  if ([mask isEqualToString: @"255.255.255.255"]){
    cidrPrefix = 32;
  }else if ([mask isEqualToString:@"255.255.255.254"]) {
    cidrPrefix = 31;
  }else if ([mask isEqualToString:@"255.255.255.252"]){
    cidrPrefix = 30;
  }else if ([mask isEqualToString:@"255.255.255.248"]){
    cidrPrefix = 29;
  }else if ([mask isEqualToString:@"255.255.255.240"]){
    cidrPrefix = 28;
  }else if ([mask isEqualToString:@"255.255.255.224"]){
    cidrPrefix = 27;
  }else if ([mask isEqualToString:@"255.255.255.192"]){
    cidrPrefix = 26;
  }else if ([mask isEqualToString:@"255.255.255.128"]){
    cidrPrefix = 25;
  }else if ([mask isEqualToString:@"255.255.255.0"]){
    cidrPrefix = 24;
  }else if ([mask isEqualToString:@"255.255.254.0"]){
    cidrPrefix = 23;
  }else if ([mask isEqualToString:@"255.255.252.0"]){
    cidrPrefix = 22;
  }else if ([mask isEqualToString:@"255.255.248.0"]){
    cidrPrefix = 21;
  }else if ([mask isEqualToString:@"255.255.240.0"]){
    cidrPrefix = 20;
  }else if ([mask isEqualToString:@"255.255.224.0"]){
    cidrPrefix = 19;
  }else if ([mask isEqualToString:@"255.255.192.0"]){
    cidrPrefix = 18;
  }else if ([mask isEqualToString:@"255.255.128.0"]){
    cidrPrefix = 17;
  }else if ([mask isEqualToString:@"255.255.0.0"]){
    cidrPrefix = 16;
  }else if ([mask isEqualToString:@"255.254.0.0"]){
    cidrPrefix = 15;
  }else if ([mask isEqualToString:@"255.252.0.0"]){
    cidrPrefix = 14;
  }else if ([mask isEqualToString:@"255.248.0.0"]){
    cidrPrefix = 13;
  }else if ([mask isEqualToString:@"255.240.0.0"]){
    cidrPrefix = 12;
  }else if ([mask isEqualToString:@"255.224.0.0"]){
    cidrPrefix = 11;
  }else if ([mask isEqualToString:@"255.192.0.0"]){
    cidrPrefix = 10;
  }else if ([mask isEqualToString:@"255.128.0.0"]){
    cidrPrefix = 9;
  }else if ([mask isEqualToString:@"255.0.0.0"]){
    cidrPrefix = 8;
  }else if ([mask isEqualToString:@"254.0.0.0"]){
    cidrPrefix = 7;
  }else if ([mask isEqualToString:@"252.0.0.0"]){
    cidrPrefix = 6;
  }else if ([mask isEqualToString:@"248.0.0.0"]){
    cidrPrefix = 5;
  }else if ([mask isEqualToString:@"240.0.0.0"]){
    cidrPrefix = 4;
  }else if ([mask isEqualToString:@"224.0.0.0"]){
    cidrPrefix = 3;
  }else if ([mask isEqualToString:@"192.0.0.0"]){
    cidrPrefix = 2;
  }else if ([mask isEqualToString:@"128.0.0.0"]){
    cidrPrefix = 1;
  }else if ([mask isEqualToString:@"0.0.0.0"]){
    cidrPrefix = 0;
  }else{
    NSLog(@"Some errors with converting CIDR prefix");
  }
  NSLog(@"CIDR: %i", cidrPrefix);
  
    //NSLog(@"")
  return cidrPrefix;
}
 
-(int)calculateNetworkWithFullStartIP:(NSString *)full_start_ip WithFullEndIP:(NSString *)full_end_ip{
  // NOTES: Split start IP
  NSArray *splitLinesStartIP = [full_start_ip componentsSeparatedByString: @"."];
  int splitLinesStartIPA = [splitLinesStartIP[0] intValue];
  int splitLinesStartIPB = [splitLinesStartIP[1] intValue];
  int splitLinesStartIPC = [splitLinesStartIP[2] intValue];
  int splitLinesStartIPD = [splitLinesStartIP[3] intValue];
  
  // NOTES: Split end IP
  NSArray *splitLinesEndIP = [full_end_ip componentsSeparatedByString: @"."];
  int splitLinesEndIPA = [splitLinesEndIP[0] intValue];
  int splitLinesEndIPB = [splitLinesEndIP[1] intValue];
  int splitLinesEndIPC = [splitLinesEndIP[2] intValue];
  int splitLinesEndIPD = [splitLinesEndIP[3] intValue];
  
  // NOTES: Convert to decimal
  int startDecimalIp = splitLinesStartIPD + (splitLinesStartIPC * 256) + (splitLinesStartIPB * 256 * 256) + (splitLinesStartIPA * 256 * 256 * 256);
  int endDecimalIp = splitLinesEndIPD + (splitLinesEndIPC * 256) + (splitLinesEndIPB * 256 * 256) + (splitLinesEndIPA * 256 * 256 * 256);
  
  // NOTES: Log for now decimal
  //NSLog(@"Start network decimal: %i \n", startDecimalIp);
  //NSLog(@"End network decimal: %i \n", endDecimalIp);
  
  // NOTES: Log bins
  NSString *startDecimalIpBin = [self convertToBinWithDecimal:startDecimalIp];
  NSString *endDecimalIpBin = [self convertToBinWithDecimal:endDecimalIp];
  
  // NOTES: Split on octets
  NSArray *splitStartDecimalOnOctet = [startDecimalIpBin componentsSeparatedByString: @" "];
  NSString *splitStartDecimalOnOctet1 = splitStartDecimalOnOctet[0];
  NSString *splitStartDecimalOnOctet2 = splitStartDecimalOnOctet[1];
  NSString *splitStartDecimalOnOctet3 = splitStartDecimalOnOctet[2];
  NSString *splitStartDecimalOnOctet4 = splitStartDecimalOnOctet[3];
  
  NSArray *splitEndDecimalOnOctet = [endDecimalIpBin componentsSeparatedByString: @" "];
  NSString *splitEndDecimalOnOctet1 = splitEndDecimalOnOctet[0];
  NSString *splitEndDecimalOnOctet2 = splitEndDecimalOnOctet[1];
  NSString *splitEndDecimalOnOctet3 = splitEndDecimalOnOctet[2];
  NSString *splitEndDecimalOnOctet4 = splitEndDecimalOnOctet[3];
  
  if ([splitStartDecimalOnOctet3 isEqualToString:splitEndDecimalOnOctet3]) {
    NSLog(@"Last bits start: %@ \n", splitStartDecimalOnOctet3);
    NSLog(@"Last bits end: %@ \n", splitEndDecimalOnOctet3);
    NSLog(@"First 3 octet is equal");
  }else if ([splitStartDecimalOnOctet1 isEqualToString:splitEndDecimalOnOctet1] && [splitStartDecimalOnOctet2 isEqualToString:splitEndDecimalOnOctet2]){
    NSLog(@"Last bits start: %@ \n", splitStartDecimalOnOctet3);
    NSLog(@"Last bits end: %@ \n", splitEndDecimalOnOctet3);
    NSLog(@"First 2 octet is equal");
    // Reverse END of octet 2
    NSMutableString *reversedSplitEndDecimalOnOctet3 = [NSMutableString stringWithCapacity:[splitEndDecimalOnOctet3 length]];
    
    [splitEndDecimalOnOctet3 enumerateSubstringsInRange:NSMakeRange(0,[splitEndDecimalOnOctet3 length]) options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences) usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {                       [reversedSplitEndDecimalOnOctet3 appendString:substring];
    }];
    
    NSMutableString *reversedSplitEndDecimalOnOctet2 = [NSMutableString stringWithCapacity:[splitEndDecimalOnOctet2 length]];
    
    [splitEndDecimalOnOctet2 enumerateSubstringsInRange:NSMakeRange(0,[splitEndDecimalOnOctet2 length]) options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences) usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {                       [reversedSplitEndDecimalOnOctet2 appendString:substring];
    }];
    
    long int test = [startDecimalIpBin intValue] & [endDecimalIpBin intValue];
    long int first = [startDecimalIpBin intValue];
    long int last = [splitEndDecimalOnOctet3 intValue];
    first &= last;
    NSLog(@"Reverse last: %@", splitStartDecimalOnOctet);
    NSString* convertedTest = [NSString stringWithFormat:@"%ld", test];
    maskDecimal = [self convertToDecimalWithBin:convertedTest];
    maskToConvert = [NSString stringWithFormat:@"255.255.%li.0", maskDecimal];
    NSLog(@"Network mask: %@", maskToConvert);
    
    int CIDR = [self getCIDRprefixByMask:maskToConvert];
    [self totalHostClean:CIDR];
  }
  
  NSLog(@"Start binary: %@.%@.%@.%@", splitStartDecimalOnOctet1, splitStartDecimalOnOctet2, splitStartDecimalOnOctet3, splitStartDecimalOnOctet4);
  NSLog(@"End binary: %@.%@.%@.%@", splitEndDecimalOnOctet1, splitEndDecimalOnOctet2, splitEndDecimalOnOctet3, splitEndDecimalOnOctet4);
  
  return 0;
}
 
-(long int)totalHostClean:(int)mask{
    //long int totalHost = (2^(32-mask)) -2;
  mask = 19;
  long int totalHost = pow(2, (32-mask)) - 2;
  NSLog(@"Total %li hosts in network", totalHost);
  return totalHost;
}
 
-(id)convertToBinWithDecimal:(int)decimal{
  NSMutableString * binString = [[NSMutableString alloc] init];
  int spacing = pow(2, 3);
  int width = (sizeof(decimal)) * spacing;
  int binaryDigit = 0;
  int integer = decimal;
  while( binaryDigit < width ){
    binaryDigit++;
    [binString insertString:((integer & 1) ? @"1" : @"0" )atIndex:0];
    if( binaryDigit % spacing == 0 && binaryDigit != width ){
      [binString insertString:@" " atIndex:0];
    }
    integer = integer >> 1;
  }
  return binString;
}
 
-(long)convertToDecimalWithBin:(NSString *)bin{
  long decimal_converted = strtol([bin UTF8String], NULL, 2);
  return decimal_converted;
}
 
 
@end
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
05.10.2013, 23:06     Расчитать маскку сети исходя из диапозона #2
else if с 20 до 94 строки страшно смотрятся
vikewoods
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 7
05.10.2013, 23:59  [ТС]     Расчитать маскку сети исходя из диапозона #3
Я только учусь ... Подскажите пожалуйста как это привезти в человеческий вид пожалуйста
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
06.10.2013, 00:56     Расчитать маскку сети исходя из диапозона #4
switch-case наверно. От этого работать лучше не будет, правда.
vikewoods
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 7
06.10.2013, 01:20  [ТС]     Расчитать маскку сети исходя из диапозона #5
Switch:Case с NSString не очень дружит кстате ...
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.10.2013, 00:11     Расчитать маскку сети исходя из диапозона #6
Там, вроде, алгоритм какой-то был. Как-то оно вычисляется, если я ничего не путаю. Точно не кучей if'ов. Это не сюда. Это в гугл или к админам.
vikewoods
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 7
07.10.2013, 04:43  [ТС]     Расчитать маскку сети исходя из диапозона #7
Гугл не помог к сожелению немогу понять этот алгоритм (
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.10.2013, 13:01     Расчитать маскку сети исходя из диапозона #8
Оно может и offtop, но хочется дать совет, который, возможно, поможет вам в будущем.
Вы сейчас просите людей помочь в том, чего не можете сами. А они, возможно, могут. Простые правила приличия требуют от вас не заставлять их работать за вас хотя бы в той части, которую вы можете сделать сами. Не разобрались в алгоритме, но хоть ссылку-то на него дать можете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2013, 14:20     Расчитать маскку сети исходя из диапозона
Еще ссылки по теме:

C# Интедкс за пределами диапозона
Нейронные сети и их моделирование Objective-C
Расчитать значение поля исходя из двух других JavaScript
Проброс диапозона портов

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

Или воспользуйтесь поиском по форуму:
vikewoods
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 7
07.10.2013, 14:20  [ТС]     Расчитать маскку сети исходя из диапозона #9
Прошу извинить. Формулы или алгоритма я так и не нашел за 3 дня обрыл первых 20 страниц яндекса и гугла.
Вообщем задал вопрос админам и понял что рассчитывать надо исходя из октетов, т.е. пример

1.0.1.0 - 1.0.3.255
00000001.00000000.00000001.00000000 - 00000001.00000000.00000011.11111111

Видим что первые 2 октета одинаковы и неизменны а также первый 6 бит третьего тоже неизменны. Как я понял мы просто заполняем 1 то что неизменно т.е. маска будет
11111111.11111111.11111100.00000000
255.255.252.0

Ну как бы переделал вот так:
Objective-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
//
//  IPCalculator.m
//  IP Network Calculator
//
//  Created by Vik Ewoods on 10/2/13.
//  Copyright (c) 2013 Vik Ewoods. All rights reserved.
//
 
#import "IPCalculator.h"
 
@implementation IPCalculator
 
// Classes Table
// Class    First Bit   Min IP      Max IP            Hosts
// A        0           1.0.0.0     126.0.0.1         2^24
// B        10          128.0.0.0   191.255.0.0       2^16
// C        110         192.0.1.0   223.255.255.0     2^8
// D        1110        224.0.0.0   239.255.255.255   Multicast
// E        11110       240.0.0.0   247.255.255.255   Reserved
 
// NOTES: CIDR -> Conver bits from 00000001 to 10000000
// NOTES: HOST -> (2^32-CIDR) - 2;
 
-(long)calculateNetworkWithFullStartIP:(NSString *)full_start_ip WithFullEndIP:(NSString *)full_end_ip{
  // NOTES: Split start IP
  NSArray *splitLinesStartIP = [full_start_ip componentsSeparatedByString: @"."];
  int splitLinesStartIPA = [splitLinesStartIP[0] intValue];
  int splitLinesStartIPB = [splitLinesStartIP[1] intValue];
  int splitLinesStartIPC = [splitLinesStartIP[2] intValue];
  int splitLinesStartIPD = [splitLinesStartIP[3] intValue];
  
  // NOTES: Split end IP
  NSArray *splitLinesEndIP = [full_end_ip componentsSeparatedByString: @"."];
  int splitLinesEndIPA = [splitLinesEndIP[0] intValue];
  int splitLinesEndIPB = [splitLinesEndIP[1] intValue];
  int splitLinesEndIPC = [splitLinesEndIP[2] intValue];
  int splitLinesEndIPD = [splitLinesEndIP[3] intValue];
  
  // NOTES: Convert to decimal
  int startDecimalIp = splitLinesStartIPD + (splitLinesStartIPC * 256) + (splitLinesStartIPB * 256 * 256) + (splitLinesStartIPA * 256 * 256 * 256);
  int endDecimalIp = splitLinesEndIPD + (splitLinesEndIPC * 256) + (splitLinesEndIPB * 256 * 256) + (splitLinesEndIPA * 256 * 256 * 256);
    //NSLog(@"Start decimal: %i", startDecimalIp);
    //NSLog(@"End decimal: %i", endDecimalIp);
  
  // NOTES: Log bins
  NSString *startDecimalIpBin = [self convertToBinWithDecimal:startDecimalIp];
  NSString *endDecimalIpBin = [self convertToBinWithDecimal:endDecimalIp];
  
  // NOTES: Split on octets
  NSArray *splitStartDecimalOnOctet = [startDecimalIpBin componentsSeparatedByString: @" "];
  NSString *splitStartDecimalOnOctet1 = splitStartDecimalOnOctet[0];
  NSString *splitStartDecimalOnOctet2 = splitStartDecimalOnOctet[1];
  NSString *splitStartDecimalOnOctet3 = splitStartDecimalOnOctet[2];
  NSString *splitStartDecimalOnOctet4 = splitStartDecimalOnOctet[3];
  
  NSArray *splitEndDecimalOnOctet = [endDecimalIpBin componentsSeparatedByString: @" "];
  NSString *splitEndDecimalOnOctet1 = splitEndDecimalOnOctet[0];
  NSString *splitEndDecimalOnOctet2 = splitEndDecimalOnOctet[1];
  NSString *splitEndDecimalOnOctet3 = splitEndDecimalOnOctet[2];
  NSString *splitEndDecimalOnOctet4 = splitEndDecimalOnOctet[3];
  
  if ([splitStartDecimalOnOctet1 isEqualToString:splitEndDecimalOnOctet1] && [splitStartDecimalOnOctet2 isEqualToString:splitEndDecimalOnOctet2] && [splitStartDecimalOnOctet3 isEqualToString:splitEndDecimalOnOctet3]){
      //NSLog(@"3 octet is equal");
      //NSLog(@"Last end octet: %@", splitEndDecimalOnOctet4);
    if([splitEndDecimalOnOctet4 isEqualToString:@"11111111"]){
      CIDR =24;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"01111111"]) {
      CIDR = 25;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00111111"]){
      CIDR = 26;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00011111"]){
      CIDR = 27;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00001111"]){
      CIDR = 28;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00000111"]){
      CIDR = 29;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00000011"]){
      CIDR = 30;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00000001"]){
      CIDR = 31;
    }else if ([splitEndDecimalOnOctet4 isEqualToString:@"00000000"]){
      CIDR = 32;
    }
  }else if ([splitStartDecimalOnOctet1 isEqualToString:splitEndDecimalOnOctet1] && [splitStartDecimalOnOctet2 isEqualToString:splitEndDecimalOnOctet2]){
      //NSLog(@"2 octet is equal");
      //NSLog(@"Last end octet: %@", splitEndDecimalOnOctet3);
    if ([splitEndDecimalOnOctet3 isEqualToString:@"00000001"]) {
      CIDR = 23;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"00000011"]){
      CIDR = 22;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"00000111"]){
      CIDR = 21;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"00001111"]){
      CIDR = 20;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"00011111"]){
      CIDR = 19;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"00111111"]){
      CIDR = 18;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"01111111"]){
      CIDR = 17;
    }else if ([splitEndDecimalOnOctet3 isEqualToString:@"11111111"]){
      CIDR = 16;
    }
  }
  return [self totalHostClean:CIDR];
    //return true;
}
 
-(long)totalHostClean:(int)cidr{
  long int totalHost = pow(2, (32-cidr)) - 2;
  return totalHost;
}
 
-(id)convertToBinWithDecimal:(int)decimal{
  NSMutableString * binString = [[NSMutableString alloc] init];
  int spacing = pow(2, 3);
  int width = (sizeof(decimal)) * spacing;
  int binaryDigit = 0;
  int integer = decimal;
  while( binaryDigit < width ){
    binaryDigit++;
    [binString insertString:((integer & 1) ? @"1" : @"0" )atIndex:0];
    if( binaryDigit % spacing == 0 && binaryDigit != width ){
      [binString insertString:@" " atIndex:0];
    }
    integer = integer >> 1;
  }
  return binString;
}
 
-(long)convertToDecimalWithBin:(NSString *)bin{
  long decimal_converted = strtol([bin UTF8String], NULL, 2);
  return decimal_converted;
}
 
 
@end
Добавлено через 1 час 0 минут
И все равно не понятно мне дальше как же это считать ((

Добавлено через 6 минут
mobidevelop, http://infocisco.ru/prefix_network_mask.html
Yandex
Объявления
07.10.2013, 14:20     Расчитать маскку сети исходя из диапозона
Ответ Создать тему
Опции темы

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