UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#include <strings.h>
void bzero(void *<i>dest</i>, size_t <i>nbytes</i>);
void bcopy(const void *<i>src</i>, void *<i>dest</i>, size_t <i>nbytes</i>);
int bcmp(const void *<i>ptr1</i>, const void *<i>ptr2</i>, size_t <i>nbytes</i>);
<i>Возвращает: 0 в случае равенства, ненулевое значение в случае неравенства</i>
Мы впервые встречаемся со спецификатором const. В приведенном примере он служит признаком того, что значения, на которые указывает указатель, то есть src, ptr1 и ptr2, не изменяются функцией. Другими словами, область памяти, на которую указывает указатель со спецификатором const, считывается функцией, но не изменяется.
Функция
bzero
bcopy
bcmp
Следующие функции являются функциями ANSI С:
#include <string.h>
void *memset(void *<i>dest</i>, int <i>c</i>, size_t <i>len</i>);
void *memcpy(void *<i>dest</i>, const void *<i>src</i>, size_t <i>nbytes</i>);
int memcmp(const void *<i>ptr1</i>, const void *<i>ptr2</i>, size_t <i>nbytes</i>);
<i>Возвращает: 0 в случае равенства, значение <0 или >0 в случае неравенства (см. текст)</i>
Функция
memset
memcpy
bcopy
bcopy
memcpy
memmove
Чтобы запомнить порядок аргументов функции memcpy, подумайте о том, что он совпадает с порядком аргументов в операторе присваивания (справа — оригинал, слева — копия).
dest = src;
Последним аргументом этой функции (как и всех ANSI-функций memXXX) всегда является длина области памяти.
Функция
memcmp
unsigned char
3.6. Функции inet_aton, inet_addr и inet_ntoa
Существует две группы функций преобразования адресов, которые мы рассматриваем в этом и следующем разделах. Они выполняют преобразование адресов Интернета из строк ASCII (удобных для человеческого восприятия) в двоичные значения с сетевым порядком байтов (эти значения хранятся в структурах адресов сокетов).
1. Функции
inet_aton
inet_ntoa
inet_addr
2. Более новые функции
inet_pton
inet_ntop
#include <arpa/inet.h>
int inet_aton(const char *<i>strptr</i>, struct in_addr *<i>addrptr</i>);
<i>Возвращает: 1, если строка преобразована успешно, 0 в случае ошибки</i>
in_addr_t inet_addr(const char *<i>strptr</i>);
<i>Возвращает: 32-разрядный адрес IPv4 в сетевом порядке байтов: INADDR_NONE в случае ошибки</i>
char *inet_ntoa(struct in_addr <i>inaddr</i>);
<i>Возвращает: указатель на строку с адресом в точечно-десятичной записи</i>
Первая из названных функций,
inet_aton
strptr
addrptr
Функция inet_aton обладает одним недокументированным свойством: если addrptr — пустой указатель (null pointer), функция все равно выполняет проверку допустимости адреса, содержащегося во входной строке, но не сохраняет результата.
Функция
inet_addr
INADDR_NONE
Характерной проблемой, сопровождающей выполнение функции inet_addr, может стать то, что, как утверждается в некоторых руководствах, в случае ошибки она возвращает значение -1 вместо INADDR_NONE. С некоторыми компиляторами это может вызвать проблемы при сравнении возвращаемого значения функции (значение без знака) с отрицательной константой.