/******************************************************************************
File Name : OJ.cpp
Version :
Author :
Created : 2014/04/9
Last Modified :
Description : IP子网段判断
Function List :
History :
1.Date : 2014/04/9
Author :
Modification: Created file
******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "oj.h"
unsigned char checkipv4seg(int seg)
{
if (seg < 0 || seg > 255)
return 0;
return 1;
}
unsigned char checkvalid(const char* ipv4)
{
int seg1,seg2,seg3,seg4;
int length = 0;
char* ptemp = NULL;
if (ipv4 == NULL)
return 0;
length = strlen(ipv4) + 1;
ptemp = (char*)malloc(length);
memset(ptemp,0,length);
if (sscanf(ipv4,"%d.%d.%d.%d%s",&seg1,&seg2,&seg3,&seg4,ptemp) != 4)
{
free(ptemp);
return 0;
}
memset(ptemp,0,length);
sprintf(ptemp,"%d.%d.%d.%d",seg1,seg2,seg3,seg4);
if (strcmp(ptemp,ipv4) != 0)
{
free(ptemp);
return 0;
}
if (!checkipv4seg(seg1) || !checkipv4seg(seg2) ||
!checkipv4seg(seg3) || !checkipv4seg(seg4))
{
free(ptemp);
return 0;
}
free(ptemp);
return 1;
}
int checkNetSegment(const char *ip1, const char *ip2, const char *mask)
{
unsigned int seg1,seg2,seg3,seg4;
unsigned int iip1 = 0,iip2 = 0,imask = 0;
if (!checkvalid((char*)ip1) || !checkvalid((char*)ip2) || !checkvalid((char*)mask))
{
return 1;
}
sscanf(ip1,"%d.%d.%d.%d",&seg1,&seg2,&seg3,&seg4);
iip1 = (seg1 << 24) | (seg2 << 16) | (seg3 << 8) | seg4;
sscanf(ip2,"%d.%d.%d.%d",&seg1,&seg2,&seg3,&seg4);
iip2 = (seg1 << 24) | (seg2 << 16) | (seg3 << 8) | seg4;
sscanf(mask,"%d.%d.%d.%d",&seg1,&seg2,&seg3,&seg4);
imask = (seg1 << 24) | (seg2 << 16) | (seg3 << 8) | seg4;
if ((iip1 & imask) == (iip2 & imask))
{
return 0;
}
return 2;
}