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

WSAStringToAddress thinks "1.2.3" is a valid IP address

我需要在 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的值,WSAStringToAddressAreturns0,说明是有效的IPv4地址,当明明只有三个八位字节。

为什么 WSAStringToAddressA 认为“1.2.3”是有效的 IPv4 地址?

因为就 Microsoft 的解析器而言,它 一个有效的 IPv4 地址。 inet_addr() 文档对此进行了更详细的解释:

Internet Addresses

Values specified using the ".'' notation take one of the following forms:

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

When four parts are specified, each is interpreted as a byte of data and assigned, from left to right, to the 4 bytes of an Internet address. When an Internet address is viewed as a 32-bit integer quantity on the Intel architecture, the bytes referred to above appear as "d.c.b.a''. That is, the bytes on an Intel processor are ordered from right to left.

The parts that make up an address in "." notation can be decimal, octal or hexadecimal as specified in the C language. Numbers that start with "0x" or "0X" imply hexadecimal. Numbers that start with "0" imply octal. All other numbers are interpreted as decimal.

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

The inet_addr function supports the decimal, octal, hexadecimal, and mixed notations for the string passed in the cp parameter.

Note The following notations are only used by Berkeley software, and nowhere else on the Internet. For compatibility with Berkeley software, the inet_addr function also supports the additional notations specified below.

When a three-part address is specified, the last part is interpreted as a 16-bit quantity and placed in the right-most 2 bytes of the network address. This makes the three-part address format convenient for specifying Class B network addresses as "128.net.host"

When a two-part address is specified, the last part is interpreted as a 24-bit quantity and placed in the right-most 3 bytes of the network address. This makes the two-part address format convenient for specifying Class A network addresses as "net.host''.

When only one part is given, the value is stored directly in the network address without any byte rearrangement.