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參數中傳遞之字串的十進位、八進位、十六進位和混合標記法。
指定兩部分位址時,最後一個部分會解譯為 24 位數量,並放在最右邊的網路位址 3 個位元組中。 這可讓兩部分位址格式方便將類別 A 網路位址指定為 「net.host''。
只指定一個部分時,值會直接儲存在網路位址中,而不需要重新排列任何位元組。
Windows Phone 8:Windows Phone 8 和更新版本Windows Phone市集應用程式支援此函式。
Windows 8.1和Windows 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