Мы впервые встречаемся со спецификатором const. В приведенном примере он служит признаком того, что значения, на которые указывает указатель, то есть src, ptr1 и ptr2, не изменяются функцией. Другими словами, область памяти, на которую указывает указатель со спецификатором const, считывается функцией, но не изменяется.
Функция bzero
обнуляет заданное число байтов в указанной области памяти. Мы часто используем эту функцию для инициализации структуры адреса сокета нулевым значением. Функция bcopy
копирует заданное число байтов из источника в место назначения. Функция bcmp
сравнивает две произвольных последовательности байтов и возвращает нулевое значение, если две байтовых строки идентичны, и ненулевое — в противном случае.
Следующие функции являются функциями ANSI С:
#include
void *memset(void *
void *memcpy(void *
int memcmp(const void *
Функция memset
присваивает заданному числу байтов значение с. Функция memcpy
аналогична функции bcopy
, но имеет другой порядок двух аргументов. Функция bcopy
корректно обрабатывает перекрывающиеся поля, в то время как поведение функции memcpy
не определено, если источник и место назначения перекрываются. В случае перекрывания полей должна использоваться функция ANSI С memmove
(упражнение 30.3).
Чтобы запомнить порядок аргументов функции memcpy, подумайте о том, что он совпадает с порядком аргументов в операторе присваивания (справа — оригинал, слева — копия).
dest = src;
Последним аргументом этой функции (как и всех ANSI-функций memXXX) всегда является длина области памяти.
Функция memcmp
сравнивает две произвольных последовательности байтов и возвращает нуль, если они идентичны. В противном случае знак возвращаемого значения определяется знаком разности между первыми несовпадающими байтами, на которые указывают unsigned char
.
3.6. Функции inet_aton, inet_addr и inet_ntoa
Существует две группы функций преобразования адресов, которые мы рассматриваем в этом и следующем разделах. Они выполняют преобразование адресов Интернета из строк ASCII (удобных для человеческого восприятия) в двоичные значения с сетевым порядком байтов (эти значения хранятся в структурах адресов сокетов).
1. Функции inet_aton
, inet_ntoa
и inet_addr
преобразуют адрес IPv4 из точечно-десятичной записи (например, 206.168.112.96) в 32-разрядное двоичное значение в сетевом порядке байтов. Возможно, вы встретите эти функции в многочисленных существующих программах.
2. Более новые функции inet_pton
и inet_ntop
работают и с адресами IPv4, и с адресами IPv6. Эти функции, описываемые в следующем разделе, мы используем в книге.
#include
int inet_aton(const char *
in_addr_t inet_addr(const char *
char *inet_ntoa(struct in_addr
Первая из названных функций, inet_aton
, преобразует строку, на которую указывает strptr
, в 32-разрядное двоичное число, записанное в сетевом порядке байтов, передаваемое через указатель addrptr
. При успешном выполнении возвращаемое значение равно 1, иначе возвращается нуль.