Рудофф Эндрю М. - UNIX: разработка сетевых приложений. 3-е изд. стр 30.

Шрифт
Фон

Сначала мы представим функции, которые берут начало от реализации Беркли, хотя в книге мы будем использовать только одну из них bzero. (Дело в том, что она имеет только два аргумента и ее проще запомнить, чем функцию memsetс тремя аргументами, как объяснялось в разделе 1.2.) Две другие функции, bcopyи bcmp, могут встретиться вам в существующих приложениях.

#include <strings.h>

void bzero(void * dest , size_t nbytes );

void bcopy(const void * src , void * dest , size_t nbytes );

int bcmp(const void * ptr1 , const void * ptr2 , size_t nbytes );

Возвращает: 0 в случае равенства, ненулевое значение в случае неравенства

ПРИМЕЧАНИЕ
Мы впервые встречаемся со спецификатором const. В приведенном примере он служит признаком того, что значения, на которые указывает указатель, то есть src, ptr1 и ptr2, не изменяются функцией. Другими словами, область памяти, на которую указывает указатель со спецификатором const, считывается функцией, но не изменяется.

Следующие функции являются функциями ANSI С:

#include <string.h>

void *memset(void * dest , int c , size_t len );

void *memcpy(void * dest , const void * src , size_t nbytes );

int memcmp(const void * ptr1 , const void * ptr2 , size_t nbytes );

Возвращает: 0 в случае равенства, значение <0 или >0 в случае неравенства (см. текст)

Функция memsetприсваивает заданному числу байтов значение с. Функция memcpyаналогична функции bcopy, но имеет другой порядок двух аргументов. Функция bcopyкорректно обрабатывает перекрывающиеся поля, в то время как поведение функции memcpyне определено, если источник и место назначения перекрываются. В случае перекрывания полей должна использоваться функция ANSI С memmove(упражнение 30.3).

ПРИМЕЧАНИЕ
Чтобы запомнить порядок аргументов функции memcpy, подумайте о том, что он совпадает с порядком аргументов в операторе присваивания (справа оригинал, слева копия).

dest = src;

Последним аргументом этой функции (как и всех ANSI-функций memXXX) всегда является длина области памяти.

Функция memcmpсравнивает две произвольных последовательности байтов и возвращает нуль, если они идентичны. В противном случае знак возвращаемого значения определяется знаком разности между первыми несовпадающими байтами, на которые указывают ptr1 и ptr2 . Предполагается, что сравниваемые байты принадлежат к типу unsigned char.

3.6. Функции inet_aton, inet_addr и inet_ntoa

1. Функции inet_aton, inet_ntoaи inet_addrпреобразуют адрес IPv4 из точечно-десятичной записи (например, 206.168.112.96) в 32-разрядное двоичное значение в сетевом порядке байтов. Возможно, вы встретите эти функции в многочисленных существующих программах.

2. Более новые функции inet_ptonи inet_ntopработают и с адресами IPv4, и с адресами IPv6. Эти функции, описываемые в следующем разделе, мы используем в книге.

#include <arpa/inet.h>

int inet_aton(const char * strptr , struct in_addr * addrptr );

Возвращает: 1, если строка преобразована успешно, 0 в случае ошибки

in_addr_t inet_addr(const char * strptr );

Возвращает: 32-разрядный адрес IPv4 в сетевом порядке байтов: INADDR_NONE в случае ошибки

char *inet_ntoa(struct in_addr inaddr );

Возвращает: указатель на строку с адресом в точечно-десятичной записи

Первая из названных функций, inet_aton, преобразует строку, на которую указывает strptr, в 32-разрядное двоичное число, записанное в сетевом порядке байтов, передаваемое через указатель addrptr. При успешном выполнении возвращаемое значение равно 1, иначе возвращается нуль.

ПРИМЕЧАНИЕ
Функция inet_aton обладает одним недокументированным свойством: если addrptr пустой указатель (null pointer), функция все равно выполняет проверку допустимости адреса, содержащегося во входной строке, но не сохраняет результата.

ПРИМЕЧАНИЕ
Характерной проблемой, сопровождающей выполнение функции inet_addr, может стать то, что, как утверждается в некоторых руководствах, в случае ошибки она возвращает значение -1 вместо INADDR_NONE. С некоторыми компиляторами это может вызвать проблемы при сравнении возвращаемого значения функции (значение без знака) с отрицательной константой.

На сегодняшний день функция inet_addrявляется нерекомендуемой, или устаревшей, и в создаваемом коде вместо нее должна использоваться функция inet_aton. Еще лучше использовать более новые функции, описанные в следующем разделе, работающие и с IPv4, и с IPv6.

Функция inet_ntoaпреобразует 32-разрядный двоичный адрес IPv4, хранящийся в сетевом порядке байтов, в точечно-десятичную строку. Строка, на которую указывает возвращаемый функцией указатель, находится в статической памяти. Это означает, что функция не допускает повторного вхождения, то есть не является повторно входимой (reentrant), что мы обсудим в разделе 11.14. Наконец, отметим, что эта функция принимает в качестве аргумента структуру, а не указатель на структуру.

ПРИМЕЧАНИЕ
Функции, принимающие структуры в качестве аргументов, встречаются редко. Более общим способом является передача указателя на структуру.

3.7. Функции inet_pton и inet_ntop

представления численный

int inet_pton(int family , const char * strptr , void * addrptr );

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке