функция inet_addr (winsock2.h)
Функция inet_addr преобразует строку, содержащую IPv4-десятичный адрес, в правильный адрес для структуры IN_ADDR .
Синтаксис
unsigned long WSAAPI 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.
В Windows XP и более ранних версиях, если строка в параметре cp является пустой строкой, inet_addr возвращает значение INADDR_ANY. Если в параметре cp передается значение NULL, то inet_addr возвращает значение INADDR_NONE.
Комментарии
Функция inet_addr интерпретирует строку символов, указанную параметром cp . Эта строка представляет числовой интернет-адрес, выраженный в стандарте Интернета ". Нотации. Возвращаемое значение — это число, подходящее для использования в качестве адреса в Интернете. Все интернет-адреса возвращаются в сетевом порядке IP-адресов (байты упорядочены слева направо). Если передать " " (пробел) в функцию inet_addr , inet_addr возвращает ноль.
В Windows Vista и более поздних версиях функцию RtlIpv4StringToAddress можно использовать для преобразования строкового представления IPv4-адреса в двоичный IPv4-адрес, представленный в виде IN_ADDR структуры. В Windows Vista и более поздних версиях функцию RtlIpv6StringToAddress можно использовать для преобразования строкового представления IPv6-адреса в двоичный IPv6-адрес, представленный в виде IN6_ADDR структуры.
Адреса в Интернете
Значения, указанные с помощью ".'' Нотация принимает одну из следующих форм:a.b.c.d a.b.c a.b a
При указании четырех частей каждая из них интерпретируется как байт данных и назначается слева направо 4 байтам интернет-адреса. Если интернет-адрес рассматривается как 32-разрядное целое число в архитектуре Intel, указанные выше байты отображаются как "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 на Windows Phone 8 и более поздних версиях.
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 |
Header | winsock2.h (включая Winsock2.h, Winsock.h) |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |
См. также раздел
IN6_ADDR