我需要检查字符串是否是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地址吗?
答案 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" Mixinet_addr函数支持cp参数中传递的字符串的十进制,八进制,十六进制和混合符号。
注意以下注释仅供伯克利软件使用,互联网上没有其他地方使用。为了与Berkeley软件兼容,inet_addr函数还支持下面指定的附加符号。
当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右侧2个字节中。这使得三部分地址格式便于将B类网络地址指定为" 128.net.host"
当指定了两部分地址时,最后一部分被解释为24位数量并放在网络地址的最右边3个字节中。这使得两部分地址格式便于将A类网络地址指定为" net.host''。
当只给出一个部分时,该值直接存储在网络地址中,而不进行任何字节重新排列。