判断IP是否在IP段内
项目当中衍生出来的一道题,给定一个IP段以及一个IP,判断这个IP是否在此IP段内。IP段的表示方法有两种,一种如192.168.1.0/24,另一种如192.168.1.1-254
例:
1.
input: 192.168.1.0/24
192.168.1.56
output: true
//192.168.1.0/24表示的IP范围是192.168.1.1~192.168.1.254,192.168.1.5.6在此范围内,返回true
2.
input: 192.168.1.0-254
192.168.1.56
output: true
//192.168.1.0-254表示的IP范围是192.168.1.1~192.168.1.254,192.168.1.5.6在此范围内,返回true
C实现方法
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
typedef unsigned int uint32_t;
typedef unsigned char u_char;
uint32_t ngx_convert_ip_to_uint(char* base) ;
bool ngx_is_black_ip_style_two(char* base, char* src);
bool ngx_is_black_ip_style_one(char* base, char* src);
int main()
{
char s[30], r[30], *pos;
bool ans;
scanf("%s\n%s", (char*)&s, (char*)&r);
pos = strchr(s, '/');
if (pos) {
ans = ngx_is_black_ip_style_one(s, r);
} else {
ans = ngx_is_black_ip_style_two(s, r);
}
printf("ans = %d\n", ans);
return 0;
}
//192.168.1.1-254
bool ngx_is_black_ip_style_two(char* base, char* src)
{
int num = 0;
char *pos;
uint32_t res[3] = {0,0,0};
pos = strchr(base, '-');
*pos = '\0';
//IP 下限
res[0] = ngx_convert_ip_to_uint(base);
num = atoi(pos+1);
printf("num = %d\n", num);
//IP上限
res[1] = res[0] + num;
//待匹配IP
res[2] = ngx_convert_ip_to_uint(src);
printf("res = %u\t%u\t%u\n", res[0], res[1], res[2]);
if (res[2] > res[0] && res[2] < res[1])
return true;
return false;
}
//Ip 192.168.0.1/24
bool ngx_is_black_ip_style_one(char* base, char* src)
{
int num = 0;
char *pos;
uint32_t res[3] = {0,0,0};
pos = strchr(base, '/');
*pos = '\0';
//IP 下限
res[0] = ngx_convert_ip_to_uint(base);
num = atoi(pos+1);
printf("num = %d\n", num);
//IP上限
res[1] = res[0] + (1 << (32 - num));
//待匹配IP
res[2] = ngx_convert_ip_to_uint(src);
printf("res = %u\t%u\t%u\n", res[0], res[1], res[2]);
if (res[2] > res[0] && res[2] < res[1])
return true;
return false;
}
//IP 转换成数字
uint32_t ngx_convert_ip_to_uint(char* base)
{
char *pos, *index;
uint32_t res = 0;
index = pos = base;
while (*pos) {
if (*pos == '.') {
*pos = '\0';
res = (res << 8) + atoi(index);
printf("res = %u\n",res);
index = pos+1;
}
pos++;
}
res = (res << 8) + atoi(index);
return res;
}