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
文件大小为14718KB,读取正常(在
之后添加printf(“%u \ n”,db.start)}
pch = strtok (NULL, "\t");
i++;
}
输出所有文件)。但是扫描ip地址有问题(如果(ip&gt; = db.start&amp;&amp; ip&lt; = db.end)),文件的前半部分没问题,但是在上半年之后没有任何结果,为什么?
PS OS - gnu / linux PSS对不起我的英文:D
答案 0 :(得分:8)
2 ^ 31及更高的值超出了atoi
可以处理的范围,它将为它们返回INT_MAX
。您可以改为使用strtoul
。