Поделиться через


функция 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 .

Примечание Следующие нотации используются только программным обеспечением Berkeley и нигде в Интернете. Для совместимости с программным обеспечением Berkeley функция inet_addr также поддерживает дополнительные нотации, указанные ниже.
 
Если указан трехкомпонентный адрес, последняя часть интерпретируется как 16-битное количество и помещается в самые правые 2 байта сетевого адреса. Это делает трехкомпонентный формат адресов удобным для указания сетевых адресов класса B как "128.net.host".

Если указан двухкомпонентный адрес, последняя часть интерпретируется как 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

IN_ADDR

InetNtop

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

RtlIpv4StringToAddress

RtlIpv4StringToAddressEx

RtlIpv6AddressToString

RtlIpv6AddressToStringEx

RtlIpv6StringToAddress

RtlIpv6StringToAddressEx

Функции Winsock

Справочник по Winsock

inet_ntoa