inet_addr 函数 (winsock2.h)
inet_addr 函数将包含 IPv4 点十进制地址的字符串转换为IN_ADDR结构的正确地址。
语法
unsigned long WSAAPI inet_addr(
const char *cp
);
参数
cp
TBD
返回值
如果未发生错误, inet_addr 函数将返回一个无符号长值,其中包含给定的 Internet 地址的合适二进制表示形式。
如果 cp 参数中的字符串不包含合法的 Internet 地址,例如,如果“a.b.c.d”地址的一部分超过 255,则 inet_addr 返回 INADDR_NONE的值。
在 Windows Server 2003 及更高版本中,如果 cp 参数中的字符串为空字符串,则inet_addr返回值INADDR_NONE。 如果在 cp 参数中传递 NULL,则inet_addr返回值INADDR_NONE。
在 Windows XP 及更早版本中,如果 cp 参数中的字符串为空字符串,则inet_addr返回值INADDR_ANY。 如果在 cp 参数中传递 NULL,则inet_addr返回值INADDR_NONE。
注解
inet_addr 函数解释 cp 参数指定的字符串。 此字符串表示以 Internet 标准“.”表示的数字 Internet 地址。 符号。 返回的值是一个适合用作 Internet 地址的数字。 所有 Internet 地址都按 IP 的网络顺序返回 (字节从左到右) 。 如果将“” (空格) 传入 inet_addr 函数, inet_addr 返回零。
在 Windows Vista 及更高版本上, RtlIpv4StringToAddress 函数可用于将 IPv4 地址的字符串表示形式转换为表示为 IN_ADDR 结构的二进制 IPv4 地址。 在 Windows Vista 及更高版本上, RtlIpv6StringToAddress 函数可用于将 IPv6 地址的字符串表示形式转换为表示为 IN6_ADDR 结构的二进制 IPv6 地址。
Internet 地址
使用“.”指定的值 表示法采用以下形式之一:a.b.c.d a.b.c.a.b
当指定四个部分时,每个部分都解释为数据的一个字节,并从左到右分配给 Internet 地址的 4 个字节。 当 Internet 地址在 Intel 体系结构中被视为 32 位整数数量时,上面提到的字节将显示为“d.c.b.a'”。 也就是说,Intel 处理器上的字节从右到左排序。
构成“.”表示法中地址的部分可以是 C 语言中指定的十进制、八进制或十六进制。 以“0x”或“0X”开头的数字表示十六进制。 以“0”开头的数字表示八进制。 所有其他数字都解释为十进制。
Internet 地址值 | 含义 |
---|---|
"4.3.2.16" | 小数 |
"004.003.002.020" | 八进制 |
“0x4.0x3.0x2.0x10” | 十六进制 |
“4.003.002.0x10” | 组合 |
inet_addr 函数支持 cp 参数中传递的字符串的十进制、八进制、十六进制和混合表示法。
指定由两部分构成的地址时,最后一部分将解释为 24 位数量,并放置在网络地址最右边的 3 个字节中。 这使得由两部分构成的地址格式便于将类 A 网络地址指定为“net.host”。
如果只提供一个部分,则该值直接存储在网络地址中,而无需重新排列任何字节。
Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。
Windows 8.1和Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。
示例
下面的代码示例演示如何使用 inet_addr 函数。
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
// need link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int __cdecl main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
unsigned long ulAddr = INADDR_NONE;
// Validate the parameters
if (argc != 2) {
printf("usage: %s <IPv4 address>\n", argv[0]);
printf(" inetaddr converts a string containing an\n");
printf(" IPv4 address in one of the supported formats\n");
printf(" to a unsigned long representing an IN_ADDR\n");
printf(" %s 192.168.16.34\n", argv[0]);
return 1;
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
//--------------------------------
// Call inet_addr(). If the call succeeds,
// the result variable will hold a IN_ADDR
ulAddr = inet_addr(argv[1]);
if ( ulAddr == INADDR_NONE ) {
printf("inet_addr failed and returned INADDR_NONE\n");
WSACleanup();
return 1;
}
if (ulAddr == INADDR_ANY) {
printf("inet_addr failed and returned INADDR_ANY\n");
WSACleanup();
return 1;
}
printf("inet_addr returned success\n");
// Here we could implement code to retrieve each address and
// print out the hex bytes
// for(i=0, ptr= (Char*) &ulAddr; i < 4; i++, ptr++) {
WSACleanup();
return 0;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 8.1,Windows Vista [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | winsock2.h (包括 Winsock2.h、Winsock.h) |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |
另请参阅
IN6_ADDR