c++ - WSAStringToAddress 认为 "1.2.3"是有效的 IP 地址

标签 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地址?

最佳答案

因为就 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.

关于c++ - WSAStringToAddress 认为 "1.2.3"是有效的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285954/

相关文章:

c++ - OpenGL:创建复杂且平滑的多边形

regex - 使用正则表达式验证 IPv4 地址

c++ - Glade 界面设计器 : could not find signal handler

java - 允许特定特殊字符的正则表达式

java - Spring Boot 验证表单

ipv4 - Docker容器没有ipv4地址

.net - 将 IPv4 header 校验和插入虚拟 IP header

c++ - 如何获取大小c++动态数组

c++ - 如何用类实例成员函数指针填充一个函数指针成员?