Книга: Разработка приложений в среде Linux. Второе издание

17.8.1. Манипулирование IPv4-адресами

17.8.1. Манипулирование IPv4-адресами

Функции inet_ntop() и inet_pton() являются относительно новыми и были введены для того, чтобы один набор функций мог обрабатывать и IPv4-, и IPv6-адреса. До их появления в программах использовались функции inet_addr(), inet_aton() и inet_ntoa(), которые предназначены только для IPv4.

Вспомните, что struct sockaddr_in определяется следующим образом

struct sockaddr__in {
 short int sin_family;        /* AF_INET */
 unsigned short int sin_port; /* номер порта */
 struct in_addr sin_addr;     /* IP-адрес */
}

Член sin_addr представляет собой структуру struct in_addr; унаследованные функции используют его в качестве параметра[145]. Подразумевается, что данная структура является непрозрачной; программы приложений могут обрабатывать struct in_addr исключительно через библиотечные функции. Старой функцией для преобразования IPv4-адреса в десятичную форму с разделительными точками служит inet_ntoa().

#include <netinet/in.h>
#include <arpa/inet.h>
char * inet_ntoa(struct in_addr address);

Передаваемый адрес преобразуется в строку в десятичном формате с разделительными точками, возвращается указатель на данную строку. Строка сохраняется в статическом буфере библиотеки С и уничтожается при следующем вызове inet_ntoa()[146].

Существуют две функции, которые предлагают обратное преобразование десятичной строки в двоичный IP-адрес. Более старая из них функция inet_addr() имеет две проблемы, обе вызванные тем, что она возвращает результат типа long. Она не возвращает struct in_addr, как предполагается остальными стандартными функциями, поэтому программисты были вынуждены выполнять неуклюжие приведения. К тому же, если переменная типа long имела 32 бита, то программы не могли различить возврат числа -1 (что указывает на ошибку, например, неправильный адрес) и двоичного представления адреса 255.255.255.255.

#include <netinet/in.h>
#include <arpa/inet.h>
unsigned long int inet_addr(const char * ddaddress);

Функция принимает передаваемую строку, которая должна содержать десятичный IP-адрес с разделительными точками, и преобразует ее в двоичный IP-адрес.

Для исправления недостатков inet_addr() была введена функция inet_aton().

#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char * ddaddress, struct in_addr * address);

Данная функция ожидает строку, содержащую десятичный IP-адрес, и размещает двоичное представление этого адреса в структуре struct in_addr, на которую указывает параметр address. В отличие от большинства библиотечных функций inet_aton() возвращает нуль в случае ошибки и ненулевое значение, если преобразование прошло успешно.

Оглавление книги


Генерация: 1.833. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз