UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
На сегодняшний день функция
inet_addr
inet_aton
Функция
inet_ntoa
Функции, принимающие структуры в качестве аргументов, встречаются редко. Более общим способом является передача указателя на структуру.
3.7. Функции inet_pton и inet_ntop
Эти функции появились с IPv6 и работают как с адресами IPv4, так и с адресами IPv6. Их мы и будем использовать в книге. Символы
p
n
int inet_pton(int <i>family</i>, const char *<i>strptr</i>, void *<i>addrptr</i>);
<i>Возвращает: 1 в случае успешного выполнения функции: 0, если входная строка имела неверный формат представления; -1 в случае ошибки</i>
const char *inet_ntop(int <i>family</i>, const void *<i>addrptr</i>,
char *<i>strptr</i>, size_t <i>len</i>);
<i>Возвращает: указатель на результат, если выполнение функции прошло успешно. NULL в случае ошибки</i>
Значением аргумента
family
AF_INET
AF_INET6
family
errno
EAFNOSUPPORT
Первая функция пытается преобразовать строку, на которую указывает
strptr
addrptr
family
Функция
inet_ntop
addrptr
strptr
len
<netinet/in.h>
#define INET_ADDRSTRLEN 16 /* для точечно-десятичной записи IPv4-адреса */
#define INET6_ADDRSTRLEN 46 /* для шестнадцатеричной записи IPv6-адреса */
Если аргумент
len
errno
ENOSPC
Аргумент
strptr
inet_ntop
На рис. 3.5 приведена схема действия пяти функций, описанных в этом и предыдущем разделах.
Рис. 3.5. Функции преобразования адресов
Пример
Даже если ваша система еще не поддерживает IPv6, вы можете использовать новые функции, заменив вызовы вида
foo.sin_addr.s_addr = inet_addr(cp);
на
inet_pton(AF_INET, cp, &foo.sin_addr);
а также заменив вызовы вида
ptr = inet_ntoa(foo.sin_addr);
на
char str[INET_ADDRSTRLEN];
ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));
В листинге 3.6 представлено простое определение функции
inet_pton
inet_ntop
Листинг 3.6. Простая версия функции inet_pton, поддерживающая только IPv4
//libfree/inet_pton_ipv4.c
10 int
11 inet_pton(int family, const char *strptr, void *addrptr)
12 {
13 if (family == AF_INET) {
14 struct in_addr in_val;
15 if (inet_aton(strptr, &in_val)) {
16 memcpy(addrptr, &in_val, sizeof(struct in_addr));
17 return (1);
18 }
19 return (0);
20 }
21 errno = EAFNOSUPPORT;
22 return (-1);
23 }
Листинг 3.7. Простая версия функции inet_ntop, поддерживающая только IPv4
//libfree/inet_ntop_ipv4.c
8 const char *
9 inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
10 {
11 const u_char *p = (const u_char*)addrptr;
12 if (family == AF_INET) {
13 char temp[INET_ADDRSTRLEN];
14 snprintf(temp, sizeof(temp), "%d.%d.%d.%d",
15 p[0], p[1], p[2], p[3]);