WSAStringToAddress认为“1.2.3”是有效的IP地址

时间:2015-03-26 18:16:53

标签: c++ validation ipv4

我需要检查字符串是否是Windows C ++应用程序中的有效IPv4地址。我使用的代码是:

char *ipAddress = ... // get from user input
struct sockaddr_in sa;
int sizeof_sa = sizeof(sa);
int valid = WSAStringToAddressA(ipAddress, AF_INET,NULL, (LPSOCKADDR)&sa,&sizeof_sa);

如果我进入" 1.2.3"作为ipAddress的值,WSAStringToAddressA返回0,表示它是一个有效的IPv4地址,当它显然只有三个八位字节时。

为什么WSAStringToAddressA会想到" 1.2.3"是有效的IPv4地址吗?

1 个答案:

答案 0 :(得分:4)

因为 是一个有效的IPv4地址,就微软的解析器而言。 inet_addr()文档更详细地解释了这一点:

  

互联网地址

     

使用"。''指定的值符号采用以下形式之一:

     

a.b.c.d a.b.c a.b a

     

当指定了四个部分时,每个部分被解释为一个数据字节,并从左到右分配到Internet地址的4个字节。当在Intel体系结构上将Internet地址视为32位整数时,上面提到的字节显示为" d.c.b.a''。也就是说,英特尔处理器上的字节从右到左排序。

     

构成地址的部分"。"符号可以是C语言中指定的十进制,八进制或十六进制。以" 0x"开头的数字或" 0X"意味着十六进制。以" 0"开头的数字暗示八进制。所有其他数字都被解释为十进制数。

Internet address value   Meaning
"4.3.2.16"               Decimal 
"004.003.002.020"        Octal 
"0x4.0x3.0x2.0x10"       Hexadecimal 
"4.003.002.0x10"         Mix 
     

inet_addr函数支持cp参数中传递的字符串的十进制,八进制,十六进制和混合符号。

     

注意以下注释仅供伯克利软件使用,互联网上没有其他地方使用。为了与Berkeley软件兼容,inet_addr函数还支持下面指定的附加符号。

     

当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右侧2个字节中。这使得三部分地址格式便于将B类网络地址指定为" 128.net.host"

     

当指定了两部分地址时,最后一部分被解释为24位数量并放在网络地址的最右边3个字节中。这使得两部分地址格式便于将A类网络地址指定为" net.host''。

     

当只给出一个部分时,该值直接存储在网络地址中,而不进行任何字节重新排列。