UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
30 #define HAVE_INET_PTON_PROTO 1 /* <arpa/inet.h> */
31 /* #undef HAVE_ISFDTYPE_PROTO */ /* <sys/stat.h> */
32 /* #undef HAVE_PSELECT_PROTO */ /* <sys/select.h> */
33 #define HAVE_SNPRINTF_PROTO 1 /* <stdio.h> */
34 /* #undef HAVE_SOCKATMARK_PROTO */ /* <sys/socket.h> */
35 /* Определены, если определены соответствующие структуры */
36 /* #undef HAVE_ADDRINFO_STRUCT */ /* <netdb.h> */
37 /* #undef HAVE_IF_NAMEINDEX_STRUCT */ /* <net/if.h> */
38 #define HAVE_SOCKADDR_DL_STRUCT 1 /* <net/if_dl.h> */
39 #define HAVE TIMESPEC STRUCT 1 /* <time.h> */
40 /* Определены, если имеется указанное свойство */
41 #define HAVE_SOCKADDR_SA_LEN 1 /* в sockaddr{} есть поле sa_len */
42 #define HAVE_MSGHDR_MSG_CONTROL 1 /* в msghdr{} есть поле msg_control */
43 /* Имена устройств XTI для TCP и UDP */
44 /* #undef HAVE_DEV_TCP */ /* большинство здесь */
45 /* #undef HAVE_DEV_XTI_TCP */ /* для AIX */
46 /* #undef HAVE_DEV_STREAMS_XTISO_TCP */ /* для OSF 3.2 */
47 /* При необходимости определяем типы данных */
48 /* #undef int8_t */ /* <sys/types.h> */
49 /* #undef int16_t */ /* <sys/types.h> */
50 /* #undef int32_t */ /* <sys/types.h> */
51 #define uint8_t unsigned char /* <sys/types.h> */
52 #define uint16_t unsigned short /* <sys/types.h> */
53 #define uint32_t unsigned int /* <sys/types.h> */
54 /* #undef size_t */ /* <sys/types.h> */
55 /* #undef ssize_t */ /* <sys/types.h> */
56 /* socklen_t должен иметь тип uint32_t, но configure определяет его
57 как unsigned int. т. к. это значение используется в начале компиляции.
58 иногда до того, как в данной реализации определяется тип uint32_t */
59 #define socklen_t unsigned int /* <sys/socket.h> */
60 #define sa_family_t SA_FAMILY_T /* <sys/socket.h> */
61 #define SA_FAMILY_T uint8_t
62 #define t_scalar_t int32_t /* <xti.h> */
63 #define t_uscalar_t uint32_t /* <xti.h> */
64 /* Определены, если система поддерживает указанное свойство */
65 #define IPV4 1 /* IPv4, V в верхнем регистре */
66 #define IPv4 1 /* IPv4, v в нижнем регистре, на всякий случай */
67 /* #undef IPV6 */ /* IPv6, V в верхнем регистре */
68 /* #undef IPv6 */ /* IPv6, v в нижнем регистре, на всякий случай */
69 #define UNIXDOMAIN 1 /* доменные сокеты Unix */
70 #define UNIXdomain 1 /* доменные сокеты Unix */
71 #define MCAST 1 /* поддержка многоадресной передачи */
Г.3. Стандартные функции обработки ошибок
В этой книге мы определяем набор своих собственных функций для обработки ошибок. Причина, по который мы создаем эти функции, заключается в том, что они позволяют нам обрабатывать ошибки с помощью одной строки кода, как, например, показано ниже:
if (<i>условие ошибки</i>)
err_sys(<i>формат printf с любым количеством аргументов</i>);
вместо
if (<i>условие ошибки</i>) {
char buff[200];
snprintf(buff, sizeof(buff), <i>формат printf с любым количеством аргументов</i>);
perror(buff);
exit(1);
}
Наши функции обработки ошибок используют следующую возможность ANSI С: список аргументов может иметь переменную длину. Более подробную информацию об этом вы найдете в разделе 7.3 книги [68].
В табл. Г.1 показано, в чем заключаются различия между функциями обработки ошибок. Если глобальная целочисленная переменная
daemon_proc
syslog
Таблица Г.1. Стандартные функции обработки ошибок
Функция | strerror (errno ?) | Завершение ? | Уровень syslog |
---|---|---|---|
err_dump | Да | abort(); | LOG_ERR |
err_msg | Нет | return; | LOG_INFO |
err_quit | Нет | exit(1); | LOG_ERR |
err_ret | Да | return; | LOG_INFO |
err_sys | Да | exit(1); | LOG_ERR |
В листинге Г.3 показаны первые пять функций из табл. Г.1.
Листинг Г.3. Стандартные функции обработки ошибок
//lib/error.c
1 #include "unp.h"