inet_addr函式 (winsock.h)

inet_addr函式會將包含 IPv4 點點十進位位址的字串轉換成IN_ADDR結構的適當位址。

語法

unsigned long inet_addr(
  const char *cp
);

參數

cp

TBD

傳回值

如果沒有發生錯誤, inet_addr 函式會傳回未帶正負號的長值,其中包含指定之網際網路位址的適當二進位標記法。

如果 cp 參數中的字串不包含合法的網際網路位址,例如,如果 「a.b.c.d」 位址的一部分超過 255, 則inet_addr 傳回值 INADDR_NONE

在 Windows Server 2003 和更新版本中,如果 cp 參數中的字串是空字串, 則inet_addr 傳回值 INADDR_NONE。 如果在cp參數中傳遞Null則inet_addr傳回值INADDR_NONE

如果 cp 參數中的字串是空字串,則在 Windows XPand 上, inet_addr 傳回值 INADDR_ANY。 如果在cp參數中傳遞Null則inet_addr傳回值INADDR_NONE

備註

inet_addr函式會解譯cp參數所指定的字元字串。 此字串代表以網際網路標準 「.'' 表示的數值網際網路位址。 符號。 傳回的值是適合用來作為網際網路位址的數位。 所有網際網路位址都會以 IP 的網路順序傳回, (位元組從左至右排序) 。 如果您傳入 「 」 (空間) 至 inet_addr 函式, inet_addr 會傳回零。

在 Windows Vista 和更新版本上, RtlIpv4StringToAddress 函式可用來將 IPv4 位址的字串表示轉換成以 IN_ADDR 結構表示的二進位 IPv4 位址。 在 Windows Vista 和更新版本上, RtlIpv6StringToAddress 函式可用來將 IPv6 位址的字串表示轉換成以 IN6_ADDR 結構表示的二進位 IPv6 位址。

網際網路位址

使用 「.'' 指定的值 標記法採用下列其中一種形式:

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

指定四個部分時,每個元件都會解譯為數據位元組,並從左至右指派給網際網路位址的 4 個位元組。 當網際網路位址在 Intel 架構上視為 32 位整數數量時,上述的位元組會顯示為 「d.c.b.a''」。 也就是說,Intel 處理器上的位元組會從右至左排序。

組成 「.」 標記法中位址的部分可以是 C 語言中指定的十進位、八進位或十六進位。 以 「0x」 或 「0X」 開頭的數位表示十六進位。 開頭為 「0」 的數位表示八進位。 所有其他數位都會解譯為十進位。

網際網路位址值 意義
"4.3.2.16" Decimal
"004.003.002.020" 八進位
「0x4.0x3.0x2.0x10」 十六進位
「4.003.002.0x10」 混合
 

inet_addr函式支援在 cp參數中傳遞之字串的十進位、八進位、十六進位和混合標記法。

注意 下列標記法只會由 Berkeley 軟體使用,且網際網路上沒有其他位置。 為了與 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 市集應用程式支援此功能,Windows 8.1、Windows Server 2012 R2 及更新版本。

範例

下列程式碼範例示範如何使用 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
標頭 winsock.h (包括 Winsock2.h、Winsock.h)
程式庫 Ws2_32.lib
Dll Ws2_32.dll

另請參閱

IN6_ADDR

IN_ADDR

InetNtop

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

RtlIpv4StringToAddress

RtlIpv4StringToAddressEx

RtlIpv6AddressToString

RtlIpv6AddressToStringEx

RtlIpv6StringToAddress

RtlIpv6StringToAddressEx

Winsock 函式

Winsock 參考

inet_ntoa