#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
long ivp4ToInt(char *str){
int i,slen = 0;
int numTemp = 0;
int dotNum = 0;
int bitNum = 0;
long ipNum = 0;
if(str == NULL){ //IP地址字符串为空
printf("str == NULL\n");
return -1;
}
slen =strlen(str);
if(slen < 7 || slen > 15){ //判断ip地址的长度是否正确,最小“X.X.X.X”,最大“XXX.XXX.XXX.XXX”
printf("strlen(str) < 7 or strlen(str)>15\n");
return -1;
}
if(str[0] == '.' || str[slen-1] == '.'){ //判断时否为以“.”开头或者结尾
printf("ip format error\n");
return -1;
}
for(i=0; i<slen; i++){
if(str[i] == '.'){ // 判断是否“X..X”,两个点相连
if(str[i-1] == '.'){
printf("pStr == . format error\n");
return -1;
}
if(++dotNum > 3){ // 判断“."的个数是否大于3个以上
printf("dot number over 3\n");
return -1;
}
if(numTemp > 255){
printf("numTemp > 255, numTemp :%d\n",numTemp);
return -1;
}
ipNum |= numTemp;
numTemp = 0;
ipNum <<= 8;
bitNum =0;
continue ;
}
if(str[i] < '0' || str[i] > '9'){ //ip内的字符是否为纯数字
printf("ip addr error, str :%c\n",str[i]);
return -1;
}
numTemp = numTemp*10 + (str[i] - '0'); //计算单个地址的数值
if(++bitNum > 3){ //判断单个地址位数是否超过3位数
printf("ip addr bit number error\n");
return -1;
}
}
if(dotNum != 3){ //判断传入的字符串“.”的个数是否为3个
printf("dotNum != 3\n");
return -1;
}
ipNum |= numTemp;
printf("ipNUm :%lx\n", ipNum);
return ipNum;
}
void main()
{
printf("return :%d\n",ivp4ToInt(".123.xxx"));
printf("return :%d\n",ivp4ToInt("123.134."));
printf("return :%d\n",ivp4ToInt("2111."));
printf("return :%ld\n",ivp4ToInt("123..123"));
printf("return :%ld\n",ivp4ToInt("1X2.123.12"));
printf("return :%ld\n",ivp4ToInt("123,123,123"));
printf("return :%ld\n",ivp4ToInt("123.123,123"));
printf("return :%ld\n",ivp4ToInt("123.323.123"));
printf("return :%ld\n",ivp4ToInt("192.168.123"));
printf("return :%ld\n",ivp4ToInt("192.168.123.125"));
printf("return :%ld\n",ivp4ToInt("19.16.1.12.5"));
printf("return :%ld\n",ivp4ToInt("255.255.255.255"));
printf("return :%ld\n",ivp4ToInt("1.0.2.4"));
}
ip地址采用将字符串位成为整型,但是因为IP地址最大位255.255.255.255,转化为整型范围超过了int的取值范围,所以应该为unsigned int类型,因为本例中转换失败时函数返回-1,所以就定义为long型,long在64位机时才是64,如果时在32或者16位机时也是32位,范围依然不够,需要更改为unsigned int类型。