判断任意两台计算机的IP地址是否属于同一子网络

来源:互联网 发布:淘宝网中老年大码棉袄 编辑:程序博客网 时间:2024/04/29 01:43

功能: 判断两台计算机IP地址是同一子网络。
输入参数:
    char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”;
    char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”;
    char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”;

返回值:
    0:IP1与IP2不属于同一子网络;
    1:IP1与IP2属于同一子网络;
*/

/*将各个值分别提取出来,len是指地址的长度,pos是指起始位置*/
int char2int(char *p,int len,int pos)
{
 int num[3]={1,10,100};  /*转换成整数的乘积系数*/
 int value;
 int i,temp,k;
 value=0;
 for(i=pos,k=0;i<pos+len;i++,k++)
 {
  temp=*(p+i)-'0';
  value+=temp * num[len-k-1];
 }
 return value;
}


int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask)
{
    /*在这里实现功能*/
 unsigned int Ip1,Ip2,netmask;
 unsigned int value;
 int len,pos,dotpos;
 int i,j,k;
 int count;
 i=j=k=pos=dotpos=0;
 Ip1=Ip2=netmask=0;
 if(pcIp1 == NULL && pcIp2 == NULL)
  return 0;
 /*to count IP1*/
 while(*(pcIp1+i)!='\0')
 {
  i++;
 }
 len=i;
 count=8;
 for(i=0;i<len;i++)
 {
  if(*(pcIp1+i) == '.')
  {
   value=char2int(pcIp1,i-pos,pos);
   pos=i+1;  /*保存dot后面的起始位置,便于计算下一个地址*/
   value=value<<(32-count);/*相应的值进行以为保存, count用来记录移位的长度*/
   Ip1|=value;
   count+=8;
   dotpos+=1;
  }
  else if(dotpos==3)    /*计算最后一位地址*/
  {
   value=char2int(pcIp1,len-pos,pos);
   value=value<<(32-count);
   Ip1|=value;
  }
 }

 /*to count IP2*/
 while(*(pcIp2+j)!='\0')
 {
  j++;
 }
 len=j;
 count=8;
 pos=dotpos=0;
 for(j=0;j<len;j++)
 {
  if(*(pcIp2+j) == '.')
  {
   value=char2int(pcIp2,j-pos,pos);
   pos=j+1;
   value=value<<(32-count);
   Ip2|=value;
   count+=8;
   dotpos+=1;
  }
  else if(dotpos==3)
  {
   value=char2int(pcIp2,len-pos,pos);
   value=value<<(32-count);
   Ip2|=value;
  }
 }

 /*to count netmask*/
 while(*(pcSubNetworkMask+k)!='\0')
 {
  k++;
 }
 len=k;
 count=8;
 pos=dotpos=0;
 for(k=0;k<len;k++)
 {
  if(*(pcSubNetworkMask+k) == '.')
  {
   value=char2int(pcSubNetworkMask,k-pos,pos);
   pos=k+1;
   value=value<<(32-count);
   netmask|=value;
   count+=8;
   dotpos+=1;
  }
  else if(dotpos==3)
  {
   value=char2int(pcSubNetworkMask,len-pos,pos);
   value=value<<(32-count);
   netmask|=value;
  }
 }
 if((Ip1 & netmask) == (Ip2 & netmask))
  return 1;
 else
  return 0;

}

 

0 0