typedef long int INT;
typedef unsigned char byte;
#define MAX_CITIES (INT)2.7e6
#define MAX_LEN (int)1e6
typedef struct
{
unsigned long start;
unsigned long end;
char *region;
char *city;
char *type;
} ipdb;
ipdb db;
char s[MAX_LEN + 1];
typedef struct
{
unsigned long start;
unsigned long end;
char *region;
char *city;
char *type;
} ipdb;
ipdb db;
void search( unsigned long ip )
{
FILE *F;
char * pch;
long i = 0;
F = fopen("cidr_ru_slave_index.db", "rt");
while (fgets(s, MAX_LEN, F))
{
trim_end(s);
pch = strtok (s, "\t");
i = 0;
while (pch != NULL)
{
switch(i)
{
case 0:
db.start = atoi(pch);
break;
case 1:
db.end = atoi(pch);
break;
case 4:
db.city = pch;
break;
case 5:
db.region = pch;
break;
case 8:
db.type = pch;
break;
}
pch = strtok (NULL, "\t");
i++;
}
if(ip >= db.start && ip <= db.end)
{
printf("Match\n");
}
}
}
Cidr_ru_slave_index.db выглядит так:
37486592 37494783 2.60.0.0 - 2.60.31.255 RU Омск Омская область Сибирский ASSIGNED PA
37494784 37502975 2.60.32.0 - 2.60.63.255 RU Омск Омская область Сибирский ASSIGNED PA
37502976 37511167 2.60.64.0 - 2.60.95.255 RU Омск Омская область Сибирский ASSIGNED PA
37511168 37519359 2.60.96.0 - 2.60.127.255 RU Омск Омская область Сибирский ASSIGNED PA
37519360 37527551 2.60.128.0 - 2.60.159.255 RU Омск Омская область Сибирский ASSIGNED PA
...
3653754624 3653754879 217.199.223.0 - 217.199.223.255 RU Москва Москва Центральный ASSIGNED PA
3653758976 3653760255 217.199.240.0 - 217.199.244.255 RU Екатеринбург Свердловская область Уральский ASSIGNED PA
3653759488 3653759503 217.199.242.0 - 217.199.242.15 RU Екатеринбург Свердловская область Уральский ASSIGNED PA
3653759520 3653759551 217.199.242.32 - 217.199.242.63 RU Екатеринбург Свердловская область Уральский ASSIGNED PA
3653759520 3653759535 217.199.242.32 - 217.199.242.47 RU Екатеринбург Свердловская область Уральский ASSIGNED PA
3653762560 3653762815 217.199.254.0 - 217.199.254.255 RU Екатеринбург Свердловская область Уральский ASSIGNED PA
Размер файла составляет 14718 КБ, и он читается нормально (с добавлением printf ("% u \ n", db.start) после
}
pch = strtok (NULL, "\t");
i++;
}
выводит весь файл). Но есть проблемы со сканированием по IP-адресу (если (ip> = db.start && ip <= db.end)), первая половина файла в порядке, но после первой половины нет никакого результата, почему? </p>
PS OS - GNU / Linux
PSS извините за мой английский: D