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() возвращает нуль в случае ошибки и ненулевое значение, если преобразование прошло успешно.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Манипулирование шрифтами

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Манипулирование шрифтами Теперь давайте выясним, как можно программно манипулировать шрифтами. Тип System.Drawing.Font представляет шрифт, установленный на машине пользователя, Типы шрифта могут определяться с помощью любого числа перегруженных конструкторов. Вот вам


14.1.3. Манипулирование процессами

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

14.1.3. Манипулирование процессами В этом разделе мы обсудим манипулирование процессами, хотя создание нового процесса необязательно связано с запуском внешней программы. Основной способ создания нового процесса — это метод fork, название которого в соответствии с


Манипулирование каталогами

Из книги Справочник по PHP автора

Манипулирование каталогами mkdirСоздание каталога.Синтаксис:bool mkdir(string $name, int $perms)Создает каталог с именем $name и правами доступа perms. Права доступа для каталогов указываются точно так же, как и для файлов. Чаще всего значение $perms устанавливают равным 0770 (предваряющий ноль


Манипулирование изображениями

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

Манипулирование изображениями imageCreateСоздание пустой картинки.Синтаксис:int imageCreate(int x, int y)Создает пустую картинку размером x на y точек и возвращает ее идентификатор. После того, как картинка создана, вся работа с ней осуществляется именно через этот идентификатор, по


17.5.2. Адресация IPv4

Из книги C++. Сборник рецептов автора Диггинс Кристофер

17.5.2. Адресация IPv4 Соединения IPv4 представляют собой кортеж из 4-х элементов (локальный хост, локальный порт, удаленный хост, удаленный порт). До установки соединения необходимо определить каждую его часть. Элементы локальный хост и удаленный хост являются IPv4-адресами.


19.3.4. Операции над адресами: команда ip address

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

19.3.4. Операции над адресами: команда ip address Команда ip address управляет адресами на устройстве. Объект для нее — это IPv4 или IPv6 адрес. Эта команда показывает адреса и их свойства, а также добавляет новые адреса.Чтобы добавить адрес 192.168.0.1/24 с маской подсети 255.255.255.0 со стандартным


7.6. Параметры сокетов IPv4

Из книги автора

7.6. Параметры сокетов IPv4 Эти параметры сокетов обрабатываются IPv4 и для них аргумент level равен IPPROTO_IP. Обсуждение пяти параметров сокетов многоадресной передачи мы отложим до раздела


Адреса IPv4 класса D

Из книги автора

Адреса IPv4 класса D Адреса класса D, лежащие в диапазоне от 224.0.0.0 до 239.255.255.255, в IPv4 являются адресами многоадресной передачи (см. табл. А.1). Младшие 28 бит адреса класса D образуют идентификатор группы многоадресной передачи (multicast group ID), а 32-разрядный адрес называется адресом


22.6. Связывание с адресами интерфейсов

Из книги автора

22.6. Связывание с адресами интерфейсов Одно из типичных применений функции get_ifi_info связано с приложениями UDP, которым нужно выполнять мониторинг всех интерфейсов на узле, чтобы знать, когда и на какой интерфейс приходит дейтаграмма. Это позволяет получающей программе


27.2. Параметры IPv4

Из книги автора

27.2. Параметры IPv4 На рис. А.1 мы показываем параметры, расположенные после 20-байтового заголовка IPv4. Как отмечено при рассмотрении этого рисунка, 4-разрядное поле длины ограничивает общий размер заголовка IPv4 до 15 32-разрядных слов (что составляет 60 байт), так что на параметры


А.2. Заголовок IPv4

Из книги автора

А.2. Заголовок IPv4 Уровень IP обеспечивает не ориентированную на установление соединения (connectionless) и ненадежную службу доставки дейтаграмм (RFC 791 [94]). Уровень IP делает все возможное для доставки IP-дейтаграммы определенному адресату, но не гарантирует, что дейтаграмма будет


А.4. Адресация IPv4

Из книги автора

А.4. Адресация IPv4 Адреса IPv4 состоят из 32 разрядов и обычно записываются в виде последовательности из четырех чисел в десятичной форме, разделенных точками. Такая запись называется точечно-десятичной. Первое из четырех чисел определяет тип адреса (табл. А.1). Исторически


Адреса IPv6, совместимые с IPv4

Из книги автора

Адреса IPv6, совместимые с IPv4 Для перехода от версии IPv4 к IPv6 планировалось также использовать адреса IPv6, совместимые с IPv4 (IPv4-compatible IPv6 addresses). Администратор узла, поддерживающего как IPv4, так и IPv6, и не имеющего соседнего IPv6-маршрутизатора, должен создать DNS запись типа AAAA,


Манипулирование файлами

Из книги автора

Манипулирование файлами Перейдем к манипуляциям с существующими файлами — копированию, перемещёнию, переименованию, удалению.Начнем с копирования — это выполняется очень простой командой, cp, имеющей, однако, весьма разнообразные аспекты применения. В самом простом