int ip_belong_to_network(char *ip,char *network) //check that ip is belong to network
,
//network:*.*.*.*/*;*.*.*.*/*;......MAX SUPPORT 8 networks
{
if(ip==NULL||network==NULL)return 0;
if(strlen(network)>=160)return 0;//
char subnetwork[8][20];
char *whitespace = ";";
char *token;
int i = 0;
for(i=0;i<8;i++)strcpy(subnetwork[i],"");//init it;
i = 0;
unsigned long int_ip = (unsigned long)ntohl(inet_addr(ip)); //ip in int
unsigned long submask=0;
unsigned long int_net=0;
for (token=strtok(network, whitespace); token!=NULL; token=strtok(NULL, whitespace))
{
if(strlen(token)<19)//max subcmd length
{
strcpy(subnetwork[i],token);
//printf("num %d str:%s
",i,subnetwork[i]);
submask = (unsigned long)get_network_submask(subnetwork[i]);
int_net = (unsigned long)get_network_network(subnetwork[i]);
//printf("ip:%x,submask:%x,net:%x,and:%x
",int_ip,submask,int_net,int_ip&subma
sk);
if((int_ip&submask)==int_net)
{
//printf("match
");
return 1;
}
i++;
}
}
return 0;
}
unsigned long get_network_submask(char *network) //input 1.1.1.0/24 return FF FF FF
00
{
unsigned long submask=0;
if(network==NULL)return 0;
char temp_net[20]="";
strcpy(temp_net,network);
char *p;
p = temp_net;
int net_len = strlen(network);
int i =0;
int sub_num=0;
while(*p!='/'&&(i<net_len)){p++;i++;}
if(*p=='/')
{
p++;
sub_num = (int)atoi(p); //24
unsigned long temp =(unsigned long)pow(2,sub_num)-1;
submask = temp<<(32-sub_num);
//printf("sub_num:%d,mask:%x
",sub_num,submask);
return submask;
}
return 0;
}
unsigned long get_network_network(char *network) //input 1.1.1.0/24 return
int(1.1.1.0)
{
if(network==NULL)return 0;
if(strlen(network)<9)return 0; //1.1.1.1/1 min length
char temp_net[20];
strcpy(temp_net,network);
char *p = temp_net;
int net_len = strlen(network);
int i =0;
while(*p!='/'&&(i<net_len)){p++;i++;}
*p=' ';
return (unsigned long)ntohl(inet_addr(temp_net));
}
º¯Êý˵Ã÷
1 ip_belong_to_network(char *ip,char
*network),ÊäÈëipµØÖ·,ÐÎʽÈç"10.10.1.1",ÍøÂçÐÎʽÈç"10.10.1.1/24",Èç¹ûÓжà¸öÍø¶Î,Ó÷ֺŷ
Ö¿ª.
2 unsigned long get_network_submask(char *network) //ÊäÈë1.1.1.0/24 return
255.255.255.0µÄ³¤ÕûÐÎʽ
Ëã·¨ÔÀí:
ÏÈÌáÈ¡ÍøÂç×Ö·û´®"/"ºóÃæµÄ×ÓÍøÎ»ÊýÄ¿,±ÈÈç24
È»ºóͨ¹ýÒ»¸ö¹«Ê½(pow(2,sub_num)-1)<<(32-sub_num),¿ÉµÃµ½Æä×ÓÍøÑÚÂëÈç255.255.255.0
×îºóÔÙͨ¹ýÅжÏip&netmaskÊÇ·ñµÈÓÚnetÈ·¶¨ÊÇ·ñÊôÓÚ¸ÃÍø¶Î