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 参数中传递的字符串的十进制、八进制、十六进制和混合表示法。

注意 以下表示法仅供伯克利软件使用,而 Internet 上没有其他位置使用。 为了与 Berkeley 软件兼容, inet_addr 函数还支持下面指定的其他表示法。
 
指定由三部分构成的地址时,最后一部分将解释为 16 位数量,并放置在网络地址最右边的 2 个字节中。 这使得三部分地址格式便于将 B 类网络地址指定为“128.net.host”

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

如果只提供一个部分,则该值直接存储在网络地址中,而无需重新排列任何字节。

Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows 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

IN_ADDR

InetNtop

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

RtlIpv4StringToAddress

RtlIpv4StringToAddressEx

RtlIpv6AddressToString

RtlIpv6AddressToStringEx

RtlIpv6StringToAddress

RtlIpv6StringToAddressEx

Winsock 函数

Winsock 参考

inet_ntoa