| У. Р. Стивенс, Б. Феннер, Э. М. Рудофф UNIX Разработка сетевых приложений 3-е издание | 1 |
| Вступительное слово | 1 |
| Предисловие | 1 |
| Часть 1 Введение. TCP/IP | 2 |
| Глава 1 Введение в сетевое программирование | 2 |
| 1.1. Введение | 2 |
| 1.2. Простой клиент времени и даты | 3 |
| 1.3. Независимость от протокола | 5 |
| 1.4. Обработка ошибок: функции-обертки | 5 |
| В любой реальной программе существенным моментом является проверка каждого вызова функции на ... | 5 |
| Значение системной переменной Unix errno | 6 |
| 1.5. Простой сервер времени и даты | 6 |
| 1.6. Таблица соответствия примеров технологии клиент-сервер | 8 |
| 1.7. Модель OSI | 9 |
| 1.8. История сетевого обеспечения BSD | 9 |
| 1.9. Сети и узлы, используемые в примерах | 10 |
| На рис. 1.7 показаны различные сети и узлы, используемые нами в примерах. Для каждого узла мы... | 10 |
| Определение топологии сети | 10 |
| 1.10. Стандарты Unix | 11 |
| Когда писалась эта книга, наибольший интерес в сфере стандартизации Unix вызывала деятельност... | 11 |
| История POSIX | 12 |
| История Open Group | 12 |
| Объединение стандартов | 12 |
| Internet Engineering Task Force | 13 |
| 1.11. 64-разрядные архитектуры | 13 |
| 1.12. Резюме | 13 |
| Упражнения | 13 |
| Глава 2 Транспортный уровень: TCP, UDP и SCRIPT | 14 |
| 2.1. Введение | 14 |
| 2.2. Обзор протоколов TCP/IP | 14 |
| 2.3. UDP: протокол пользовательских дейтаграмм | 15 |
| 2.4. TCP: протокол контроля передачи | 15 |
| 2.5. SCRIPT: протокол управления передачей потоков | 16 |
| 2.6. Установление и завершение соединения TCP | 16 |
| Чтобы облегчить понимание функций connect, accept и close и чтобы нам было легче отлаживать п... | 16 |
| Трехэтапное рукопожатие | 16 |
| Параметры TCP | 16 |
| Завершение соединения TCP | 17 |
| Диаграмма состояний TCP | 17 |
| Обмен пакетами | 18 |
| 2.7. Состояние TIME_WAIT | 18 |
| 2.8. Установление и завершение ассоциации SCRIPT | 19 |
| Протокол SCRIPT ориентирован на установление соединения, подобно TCP, поэтому он также имеет ... | 19 |
| Четырехэтапное рукопожатие | 19 |
| Завершение ассоциации | 19 |
| Диаграмма состояний SCRIPT | 19 |
| Обмен пакетами | 19 |
| Параметры SCRIPT | 20 |
| 2.9. Номера портов | 20 |
| В любой момент времени каждый транспортный протокол (UDP, TCP, SCRIPT) может использоваться н... | 20 |
| Пара сокетов | 20 |
| 2.10. Номера портов TCP и параллельные серверы | 21 |
| 2.11. Размеры буфера и ограничения | 21 |
| Существуют несколько ограничений, устанавливающих максимальный размер дейтаграмм IP. Сначала ... | 21 |
| Отправка по TCP | 22 |
| Отправка по UDP | 23 |
| Отправка по SCRIPT | 23 |
| 2.12. Стандартные службы Интернета | 23 |
| 2.13. Использование протоколов типичными приложениями Интернета | 24 |
| 2.14. Резюме | 25 |
| Упражнения | 25 |
| Часть 2 Элементарные сокеты | 25 |
| Глава 3 Введение в сокеты | 25 |
| 3.1. Введение | 25 |
| 3.2. Структуры адреса сокетов | 25 |
| Большинство функций сокетов используют в качестве аргумента указатель на структуру адреса сок... | 25 |
| Структура адреса сокета IPv4 | 25 |
| Универсальная структура адреса сокета | 27 |
| Структура адреса сокета IPv6 | 27 |
| Новая универсальная структура адреса сокета | 28 |
| Сравнение структур адреса сокетов | 28 |
| 3.3. Аргументы типа «значение-результат» | 28 |
| 3.4. Функции определения порядка байтов | 29 |
| 3.5. Функции управления байтами | 30 |
| 3.6. Функции inet_aton, inet_addr и inet_ntoa | 31 |
| 3.7. Функции inet_pton и inet_ntop | 32 |
| Эти функции появились с IPv6 и работают как с адресами IPv4, так и с адресами IPv6. Их мы и б... | 32 |
| Пример | 32 |
| 3.8. Функция sock_ntop и связанные с ней функции | 33 |
| 3.9. Функции readn, writen и readline | 34 |
| 3.10. Резюме | 36 |
| Упражнения | 36 |
| Глава 4 Элементарные сокеты TCP | 37 |
| 4.1. Введение | 37 |
| 4.2. Функция socket | 37 |
| Чтобы обеспечить сетевой ввод-вывод, процесс должен начать работу с вызова функции socket, за... | 37 |
| AF_xxx и PF_xxx | 38 |
| 4.3. Функция connect | 38 |
| 4.4. Функция bind | 39 |
| 4.5. Функция listen | 40 |
| 4.6. Функция accept | 43 |
| Функция accept вызывается сервером TCP для возвращения следующего установленного соединения и... | 43 |
| Пример: аргументы типа «значение-результат» | 43 |
| 4.7. Функции fork и exec | 44 |
| 4.8. Параллельные серверы | 45 |
| 4.9. Функция close | 46 |
| Обычная функция Unix close также используется для закрытия сокета и завершения соединения TCP... | 46 |
| Счетчик ссылок дескриптора | 46 |
| 4.10. Функции getsockname и getpeername | 46 |
| Эти две функции возвращают либо локальный (функция getsockname), либо удаленный (функция getp... | 46 |
| Пример: получение семейства адресов сокета | 47 |
| 4.11. Резюме | 47 |
| Упражнения | 47 |
| Глава 5 Пример TCP-соединения клиент-сервер | 48 |
| 5.1. Введение | 48 |
| 5.2. Эхо-сервер TCP: функция main | 48 |
| 5.3. Эхо-сервер TCP: функция str_echo | 49 |
| 5.4. Эхо-клиент TCP: функция main | 49 |
| 5.5. Эхо-клиент TCP: функция str_cli | 49 |
| 5.6. Нормальный запуск | 50 |
| 5.7. Нормальное завершение | 51 |
| 5.8. Обработка сигналов POSIX | 51 |
| Сигнал — это уведомление процесса о том, что произошло некое событие. Иногда сигналы называют... | 51 |
| Функция signal | 51 |
| Семантика сигналов POSIX | 52 |
| 5.9. Обработка сигнала SIGCHLD | 52 |
| Назначение состояния зомби — сохранить информацию о дочернем процессе, чтобы родительский про... | 52 |
| Обработка зомбированных процессов | 52 |
| Обработка прерванных системных вызовов | 53 |
| 5.10. Функции wait и waitpid | 54 |
| В листинге 5.7 мы вызываем функцию wait для обработки завершенного дочернего процесса. ... | 54 |
| Различия между функциями wait и waitpid | 54 |
| 5.11. Прерывание соединения перед завершением функции accept | 56 |
| 5.12. Завершение процесса сервера | 56 |
| 5.13. Сигнал SIGPIPE | 57 |
| 5.14. Сбой на узле сервера | 58 |
| 5.15. Сбой и перезагрузка на узле сервера | 58 |
| 5.16. Выключение узла сервера | 58 |
| 5.17. Итоговый пример TCP | 58 |
| 5.18. Формат данных | 59 |
| В нашем примере сервер никогда не исследует запрос, который он получает от клиента. Сервер ли... | 59 |
| Пример: передача текстовых строк между клиентом и сервером | 59 |
| Пример: передача двоичных структур между клиентом и сервером | 59 |
| 5.19. Резюме | 60 |
| Упражнения | 60 |
| Глава 6 Мультиплексирование ввода-вывода: функции select и poll | 61 |
| 6.1. Введение | 61 |
| 6.2. Модели ввода-вывода | 61 |
| Прежде чем начать описание функций select и poll, мы должны вернуться назад и уяснить основны... | 61 |
| Модель блокируемого ввода-вывода | 61 |
| Модель неблокируемого ввода-вывода | 62 |
| Модель мультиплексирования ввода-вывода | 62 |
| Модель ввода-вывода, управляемого сигналом | 62 |
| Модель асинхронного ввода-вывода | 62 |
| Сравнение моделей ввода-вывода | 63 |
| Сравнение синхронного и асинхронного ввода-вывода | 63 |
| 6.3. Функция select | 63 |
| Эта функция позволяет процессу сообщить ядру, что необходимо подождать, пока не произойдет од... | 63 |
| При каких условиях дескриптор становится готовым? | 65 |
| Максимальное число дескрипторов для функции select | 65 |
| 6.4. Функция str_cli (продолжение) | 66 |
| 6.5. Пакетный ввод | 67 |
| 6.6. Функция shutdown | 68 |
| 6.7. Функция str_cli (еще раз) | 68 |
| 6.8. Эхо-сервер TCP (продолжение) | 69 |
| Вернемся к нашему эхо-серверу TCP из разделов 5.2 и 5.3. Перепишем сервер как одиночный проце... | 69 |
| Атака типа «отказ в обслуживании» | 71 |
| 6.9. Функция pselect | 71 |
| 6.10. Функция poll | 72 |
| 6.11. Эхо-сервер TCP (еще раз) | 73 |
| 6.12. Резюме | 74 |
| Упражнения | 75 |
| Глава 7 Параметры сокетов | 75 |
| 7.1. Введение | 75 |
| 7.2. Функции getsockopt и setsockopt | 75 |
| 7.3. Проверка наличия параметра и получение значения по умолчанию | 76 |
| 7.4. Состояния сокетов | 79 |
| 7.5. Общие параметры сокетов | 79 |
| Мы начнем с обсуждения общих параметров сокетов. Эти параметры не зависят от протокола (то ес... | 79 |
| Параметр сокета SO_BROADCAST | 79 |
| Параметр сокета SO_DEBUG | 79 |
| Параметр сокета SO_DONTROUTE | 79 |
| Параметр сокета SO_ERROR | 79 |
| Параметр сокета SO_KEEPALIVE | 80 |
| Параметр сокета SO_LINGER | 81 |
| Параметр сокета SO_OOBINLINE | 82 |
| Параметры сокета SO_RCVBUF и SO_SNDBUF | 82 |
| Параметры сокета SO_RCVLOWAT и SO_SNDLOWAT | 83 |
| Параметры сокета SO_RCVTIMEO и SO_SNDTIMEO | 83 |
| Параметры сокета SO_REUSEADDR и SO_REUSEPORT | 84 |
| Параметр сокета SO_TYPE | 85 |
| Параметр сокета SO_USELOOPBACK | 85 |
| 7.6. Параметры сокетов IPv4 | 85 |
| Эти параметры сокетов обрабатываются IPv4 и для них аргумент level равен IPPROTO_IP. Обсужден... | 85 |
| Параметр сокета IP_HRDINCL | 85 |
| Параметр сокета IP_OPTIONS | 85 |
| Параметр сокета IP_RECVDSTADDR | 86 |
| Параметр сокета IP_RECVIF | 86 |
| Параметр сокета IP_TOS | 86 |
| Параметр сокета IP_TTL | 86 |
| 7.7. Параметр сокета ICMPv6 | 86 |
| Единственный параметр сокета, обрабатываемый ICMPv6, имеет аргумент level, равный IPPROTO_ICM... | 86 |
| Параметр сокета ICMP6_FILTER | 86 |
| 7.8. Параметры сокетов IPv6 | 86 |
| Эти параметры сокетов обрабатываются IPv6 и имеют аргумент level, равный IPPROTO_IPV6. Мы отл... | 86 |
| Параметр сокета IPV6_CHECKSUM | 86 |
| Параметр сокета IPV6_DONTFRAG | 86 |
| Параметр сокета IPV6_NEXTHOP | 86 |
| Параметр сокета IPV6_PATHMTU | 86 |
| Параметр сокета IPV6_RECVDSTOPTS | 86 |
| Параметр сокета IPV6_RECVHOPLIMIT | 86 |
| Параметр сокета IPV6_RECVHOPOPTS | 87 |
| Параметр сокета IPV6_RECVPATHMTU | 87 |
| Параметр сокета IPV6_RECVPKTINFO | 87 |
| Параметр сокета IPV6_RECVRTHDR | 87 |
| Параметр сокета IPV6_RECVTCLASS | 87 |
| Параметр сокета IPV6_UNICAST_HOPS | 87 |
| Параметр сокета IPV6_USE_MIN_MTU | 87 |
| Параметр сокета IPV6_V6ONLY | 87 |
| Параметры сокета IPV6_XXX | 87 |
| 7.9. Параметры сокетов TCP | 87 |
| Для сокетов TCP предусмотрены два специальных параметра. Для них необходимо указывать level I... | 87 |
| Параметр сокета TCP_MAXSEG | 87 |
| Параметр сокета TCP_NODELAY | 87 |
| 7.10. Параметры сокетов SCTP | 88 |
| Относительно большое количество параметров, определенных для сокетов SCTP (17 на момент напис... | 88 |
| Параметр сокета SCTP_ADAPTION_LAYER | 88 |
| Параметр сокета SCTP_ASSOCINFO | 88 |
| Параметр сокета SCTP_AUTOCLOSE | 89 |
| Параметр сокета SCTP_DEFAULT_SEND_PARAM | 89 |
| Параметр сокета SCTP_DISАВLE_FRAGМENTS | 90 |
| Параметр сокета SCTP_EVENTS | 90 |
| Параметр сокета SCTP_GET_PEER_ADDR_INFO | 90 |
| Параметр сокета SCTP_I_WANT_MAPPED_V4_ADDR | 91 |
| Параметр сокета SCTP_INITMSG | 91 |
| Параметр сокета SCTP_MAXBURST | 91 |
| Параметр сокета SCTP_MAXSEG | 91 |
| Параметр сокета SCTP_NODELAY | 91 |
| Параметр сокета SCTP_PEER_ADDR_PARAMS | 91 |
| Параметр сокета SCTP_PRIMARY_ADDR | 92 |
| Параметр сокета SCTP_RTOINFO | 92 |
| Параметр сокета SCTP_SET_PEER_PRIMARY_ADDR | 92 |
| Параметр сокета SCTP_STATUS | 92 |
| 7.11. Функция fcntl | 93 |
| 7.12. Резюме | 94 |
| Упражнения | 95 |
| Глава 8 Основные сведения о сокетах UDP | 96 |
| 8.1. Введение | 96 |
| 8.2. Функции recvfrom и sendto | 96 |
| 8.3. Эхо-сервер UDP: функция main | 97 |
| 8.4. Эхо-сервер UDP: функция dg_echo | 97 |
| 8.5. Эхо-клиент UDP: функция main | 98 |
| 8.6. Эхо-клиент UDP: функция dg_cli | 98 |
| 8.7. Потерянные дейтаграммы | 98 |
| 8.8. Проверка полученного ответа | 98 |
| 8.9. Запуск клиента без запуска сервера | 99 |
| 8.10. Итоговый пример клиент-сервера UDP | 100 |
| 8.11. Функция connect для UDP | 101 |
| В конце разделе 8.9 мы упомянули, что асинхронные ошибки не возвращаются на сокете UDP, если ... | 101 |
| Многократный вызов функции connect для сокета UDP | 102 |
| Производительность | 102 |
| 8.12. Функция dg_cli (продолжение) | 102 |
| 8.13. Отсутствие управления потоком в UDP | 103 |
| Теперь мы проверим, как влияет на работу приложения отсутствие какого-либо управления потоком... | 103 |
| Приемный буфер сокета UDP | 104 |
| 8.14. Определение исходящего интерфейса для UDP | 104 |
| 8.15. Эхо-сервер TCP и UDP, использующий функцию select | 105 |
| 8.16. Резюме | 106 |
| Упражнения | 106 |
| Глава 9 Основы сокетов SCTP | 107 |
| 9.1. Введение | 107 |
| 9.2. Модели интерфейса | 107 |
| Сокеты SCTP бывают двух типов: «один-к-одному» и «один-ко-многим». Сокету типа «один-к-одному... | 107 |
| Сокет типа «один-к-одному» | 107 |
| Сокет типа «один-ко-многим» | 108 |
| 9.3. Функция sctp_bindx | 108 |
| 9.4. Функция sctp_connectx | 109 |
| 9.5. Функция sctp_getpaddrs | 109 |
| 9.6. Функция sctp_freepaddrs | 109 |
| 9.7. Функция sctp_getladdrs | 109 |
| 9.8. Функция sctp_freeladdrs | 110 |
| 9.9. Функция sctp_sendmsg | 110 |
| 9.10. Функция sctp_recvmsg | 110 |
| 9.11. Функция sctp_opt_info | 110 |
| 9.12. Функция sctp_peeloff | 111 |
| 9.13. Функция shutdown | 111 |
| 9.14. Уведомления | 111 |
| 9.15. Резюме | 114 |
| Упражнения | 114 |
| Глава 10 Пример SCTP-соединения клиент-сервер | 114 |
| 10.1. Введение | 114 |
| 10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main | 114 |
| 10.3. Потоковый эхо-клиент SCTP типа «один-ко-многим»: функция main | 115 |
| 10.4. Потоковый эхо-клиент SCTP: функция str_cli | 116 |
| В листинге 10.3 приведена основная функция эхо-клиента SCTP. Листинг 10.3. Функция sctp... | 116 |
| Запуск программы | 116 |
| 10.5. Блокирование очереди | 117 |
| Наш сервер позволяет отправлять текстовые сообщения по любому из нескольких потоков. Поток SC... | 117 |
| Запуск программы | 118 |
| Запуск измененной программы | 119 |
| 10.6. Управление количеством потоков | 119 |
| 10.7. Управление завершением соединения | 119 |
| 10.8. Резюме | 120 |
| Упражнения | 120 |
| Глава 11 Преобразования имен и адресов | 120 |
| 11.1. Введение | 120 |
| 11.2. Система доменных имен | 121 |
| Система доменных имен (Domain Name System, DNS) используется прежде всего для сопоставления и... | 121 |
| Записи ресурсов | 121 |
| Распознаватели и серверы имен | 121 |
| Альтернативы DNS | 122 |
| 11.3. Функция gethostbyname | 122 |
| Узлы компьютерных сетей мы обычно идентифицируем по их именам, удобным для человеческого восп... | 122 |
| Пример | 123 |
| 11.4 Функция gethostbyaddr | 123 |
| 11.5. Функции getservbyname и getservbyport | 124 |
| Службы, как и узлы, также часто идентифицируются по именам. Используя в нашем коде имя службы... | 124 |
| Пример: использование функций gethostbyname и getservbyname | 124 |
| 11.6. Функция getaddrinfo | 126 |
| 11.7. Функция gai_strerror | 128 |
| 11.8. Функция freeaddrinfo | 129 |
| 11.9. Функция getaddrinfo: IPv6 | 129 |
| 11.10. Функция getaddrinfo: примеры | 130 |
| 11.11. Функция host_serv | 130 |
| 11.12. Функция tcp_connect | 131 |
| Теперь мы напишем две функции, использующие функцию getaddrinfo для обработки большинства сце... | 131 |
| Пример: клиент времени и даты | 131 |
| 11.13. Функция tcp_listen | 132 |
| Наша следующая функция, tcp_listen, выполняет обычные шаги сервера TCP: создание сокета TCP, ... | 132 |
| Пример: сервер времени и даты | 133 |
| Пример: сервер времени и даты с указанием протокола | 134 |
| 11.14. Функция udp_client | 135 |
| Наши функции, предоставляющие более простой интерфейс для функции getaddrinfo, в случае UDP и... | 135 |
| Пример: не зависящий от протокола UDP-клиент времени и даты | 135 |
| 11.15. Функция udp_connect | 136 |
| 11.16. Функция udp_server | 136 |
| Наша последняя функция, предоставляющая более простой интерфейс для функции getaddrinfo, — эт... | 136 |
| Пример: не зависящий от протокола UDP-сервер времени и даты | 137 |
| 11.17. Функция getnameinfo | 137 |
| 11.18. Функции, допускающие повторное вхождение | 138 |
| 11.19. Функции gethostbyname_r и gethostbyaddr_r | 140 |
| 11.20. Устаревшие функции поиска адресов IPv6 | 141 |
| В процессе разработки IPv6 интерфейс поиска адресов IPv6 много раз претерпевал серьезные изме... | 141 |
| Константа RES_USE_INET6 | 141 |
| Функция gethostbyname2 | 141 |
| Функция getipnodebyname | 141 |
| 11.21. Другая информация о сетях | 141 |
| 11.22. Резюме | 142 |
| Упражнения | 142 |
| Часть 3 Дополнительные возможности сокетов | 143 |
| Глава 12 Совместимость IPv4 и IPv6 | 143 |
| 12.1. Введение | 143 |
| 12.2. Клиент IPv4, сервер IPv6 | 143 |
| 12.3. Клиент IPv6, сервер IPv4 | 144 |
| Теперь мы поменяем протоколы, используемые клиентом и сервером в примере из предыдущего разде... | 144 |
| Резюме: совместимость IPv4 и IPv6 | 144 |
| 12.4. Макроопределения проверки адреса IPv6 | 145 |
| 12.5. Переносимость исходного кода | 145 |
| 12.6. Резюме | 146 |
| Упражнения | 146 |
| Глава 13 Процессы-демоны и суперсервер inetd | 146 |
| 13.1. Введение | 146 |
| 13.2. Демон syslogd | 146 |
| 13.3. Функция syslog | 147 |
| 13.4. Функция daemon_init | 148 |
| В листинге 13.1[1] показана функция, называемая daemon_init, которую мы можем вызвать (обычно... | 148 |
| Пример: сервер времени и даты в качестве демона | 150 |
| 13.5. Демон inetd | 150 |
| 13.6. Функция daemon_inetd | 152 |
| В листинге 13.3 показана функция daemon_inetd, которую мы можем вызвать с сервера, запущенног... | 152 |
| Пример: сервер времени и даты, активизированный демоном inetd | 152 |
| 13.7. Резюме | 153 |
| Упражнения | 153 |
| Глава 14 Дополнительные функции ввода-вывода | 153 |
| 14.1. Введение | 153 |
| 14.2. Тайм-ауты сокета | 154 |
| Существует три способа установки тайм-аута для операции ввода-вывода через сокет. 1. Вы... | 154 |
| Тайм-аут для функции connect (сигнал SIGALRM) | 154 |
| Тайм-аут для функции recvfrom (сигнал SIGALRM) | 155 |
| Тайм-аут для функции recvfrom (функция select) | 155 |
| Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO) | 156 |
| 14.3. Функции recv и send | 156 |
| 14.4. Функции readv и writev | 157 |
| 14.5. Функции recvmsg и sendmsg | 157 |
| 14.6. Вспомогательные данные | 160 |
| 14.7. Сколько данных находится в очереди? | 161 |
| 14.8. Сокеты и стандартный ввод-вывод | 161 |
| Во всех наших примерах мы применяли то, что иногда называется вводом-выводом Unix, вызывали ф... | 161 |
| Пример: функция str_echo, использующая стандартный ввод-вывод | 162 |
| 14.9. Расширенный опрос | 163 |
| В начале этой главы мы рассказывали о способах установки таймеров для операций с сокетами. Во... | 163 |
| Интерфейс /dev/poll | 163 |
| Интерфейс kqueue | 164 |
| Рекомендации | 166 |
| 14.10. Резюме | 166 |
| Упражнения | 166 |
| Глава 15 Доменные протоколы Unix | 167 |
| 15.1. Введение | 167 |
| 15.2. Структура адреса доменного сокета Unix | 167 |
| В листинге 15.1[1] показана структура адреса доменного сокета Unix, задаваемая включением заг... | 167 |
| Пример: функция bind и доменный сокет Unix | 167 |
| 15.3. Функция socketpair | 168 |
| 15.4. Функции сокетов | 168 |
| 15.5. Клиент и сервер потокового доменного протокола Unix | 169 |
| 15.6. Клиент и сервер дейтаграммного доменного протокола Unix | 170 |
| 15.7. Передача дескрипторов | 171 |
| Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно и... | 171 |
| Пример передачи дескриптора | 171 |
| 15.8. Получение информации об отправителе | 174 |
| На рис. 14.4 мы показали другой тип информации, передаваемой через доменный сокет Unix в виде... | 174 |
| Пример | 175 |
| 15.9. Резюме | 176 |
| Упражнения | 176 |
| Глава 16 Неблокируемый ввод-вывод | 177 |
| 16.1. Введение | 177 |
| 16.2. Неблокируемые чтение и запись: функция str_cli (продолжение) | 177 |
| Мы снова возвращаемся к нашей функции str_cli, которую мы обсуждали в разделах 5.5 и 6.4. Пос... | 177 |
| Более простая версия функции str_cli | 181 |
| Сравнение времени выполнения различных версий функции str_cli | 182 |
| 16.3. Неблокируемая функция connect | 182 |
| 16.4. Неблокируемая функция connect: клиент времени и даты | 183 |
| В листинге 16.7 показана наша функция connect_nonb, вызывающая неблокируемую функцию connect.... | 183 |
| Прерванная функция connect | 184 |
| 16.5. Неблокируемая функция connect: веб-клиент | 184 |
| Первое практическое использование неблокируемой функции connect относится к веб-клиенту Netsc... | 184 |
| Эффективность одновременных соединений | 188 |
| 16.6. Неблокируемая функция accept | 188 |
| 16.7. Резюме | 189 |
| Упражнения | 189 |
| Глава 17 Операции функции ioctl | 190 |
| 17.1. Введение | 190 |
| 17.2. Функция ioctl | 190 |
| 17.3. Операции с сокетами | 191 |
| 17.4. Операции с файлами | 191 |
| 17.5. Конфигурация интерфейса | 191 |
| 17.6. Функция get_ifi_info | 192 |
| 17.7. Операции с интерфейсами | 197 |
| 17.8. Операции с кэшем ARP | 198 |
| Операции с кэшем ARP также осуществляются с помощью функции ioctl. В этих запросах использует... | 198 |
| Пример: вывод аппаратного адреса узла | 198 |
| 17.9. Операции с таблицей маршрутизации | 199 |
| 17.10. Резюме | 199 |
| Упражнения | 199 |
| Глава 18 Маршрутизирующие сокеты | 199 |
| 18.1. Введение | 199 |
| 18.2. Структура адреса сокета канального уровня | 200 |
| 18.3. Чтение и запись | 200 |
| Создав маршрутизирующий сокет, процесс может отправлять ядру команды путем записи в этот соке... | 200 |
| Пример: получение и вывод записи из таблицы маршрутизации | 202 |
| 18.4. Операции функции sysctl | 204 |
| Маршрутизирующие сокеты нужны нам главным образом для проверки таблицы маршрутизации и списка... | 204 |
| Пример: определяем, включены ли контрольные суммы UDP | 206 |
| 18.5. Функция get_ifi_info (повтор) | 206 |
| 18.6. Функции имени и индекса интерфейса | 208 |
| Документ RFC 3493 [36] определяет четыре функции, обрабатывающие имена и индексы интерфейсов.... | 208 |
| Функция if_nametoindex | 208 |
| Функция if_indextoname | 209 |
| Функция if_nameindex | 209 |
| Функция if_freenameindex | 210 |
| 18.7. Резюме | 210 |
| Упражнения | 210 |
| Глава 19 Сокеты управления ключами | 210 |
| 19.1. Введение | 210 |
| 19.2. Чтение и запись | 211 |
| 19.3. Дамп базы соглашений о безопасности | 212 |
| 19.4. Создание статического соглашения о безопасности | 214 |
| Наиболее прямолинейным методом добавления соглашения о безопасности в базу является отправка ... | 214 |
| Пример | 216 |
| 19.5. Динамическое управление SA | 217 |
| Для повышения безопасности требуется периодическая смена ключей. Обычно для этого используетс... | 217 |
| Пример | 218 |
| 19.6. Резюме | 218 |
| Упражнения | 219 |
| Глава 20 Широковещательная передача | 219 |
| 20.1. Введение | 219 |
| 20.2. Широковещательные адреса | 219 |
| 20.3. Направленная и широковещательная передачи | 220 |
| 20.4. Функция dg_cli при использовании широковещательной передачи | 221 |
| Мы еще раз изменим нашу функцию dg_cli, на этот раз дав ей возможность отправлять широковещат... | 221 |
| Фрагментация IP-пакетов и широковещательная передача | 222 |
| 20.5. Ситуация гонок | 222 |
| Ситуация гонок (race condition) обычно возникает, когда множество процессов получают доступ к... | 222 |
| Блокирование и разблокирование сигнала с помощью функции pselect | 224 |
| Использование функций sigsetjmp и siglongjmp | 225 |
| Применение IPC в обработчике сигнала функции | 225 |
| 20.6. Резюме | 226 |
| Упражнения | 227 |
| Глава 21 Многоадресная передача | 227 |
| 21.1. Введение | 227 |
| 21.2. Адрес многоадресной передачи | 227 |
| При описании адресов многоадресной передачи необходимо провести различия между IPv4 и IPv6. ... | 227 |
| Адреса IPv4 класса D | 227 |
| Адреса многоадресной передачи IPv6 | 227 |
| Область действия адресов многоадресной передачи | 228 |
| Сеансы многоадресной передачи | 228 |
| 21.3. Сравнение многоадресной и широковещательной передачи в локальной сети | 228 |
| 21.4. Многоадресная передача в глобальной сети | 229 |
| 21.5. Многоадресная передача от отправителя | 230 |
| 21.6. Параметры сокетов многоадресной передачи | 230 |
| 21.7. Функция mcast_join и родственные функции | 233 |
| Несмотря на то что параметры сокетов многоадресной передачи для IPv4 аналогичны параметрам со... | 233 |
| Пример: функция mcast_join | 234 |
| Пример: функция mcast_set_loop | 235 |
| 21.8 Функция dg_cli, использующая многоадресную передачу | 236 |
| Мы изменяем нашу функцию dg_cli, показанную в листинге 20.1, просто удаляя вызов функции sets... | 236 |
| Фрагментация IP и многоадресная передача | 236 |
| 21.9. Получение анонсов сеансов многоадресной передачи | 236 |
| 21.10. Отправка и получение | 238 |
| Программа для получения анонсов сеанса многоадресной передачи, показанная в предыдущем раздел... | 238 |
| Пример | 240 |
| 21.11. SNTP: простой синхронизирующий сетевой протокол | 240 |
| 21.12. Резюме | 242 |
| Упражнения | 242 |
| Глава 22 Дополнительные сведения о сокетах udp | 243 |
| 22.1. Введение | 243 |
| 22.2. Получение флагов, IP-адреса получателя и индекса интерфейса | 243 |
| Исторически функции sendmsg и recvmsg использовались только для передачи дескрипторов через д... | 243 |
| Пример: вывод IP-адреса получателя и флага обрезки дейтаграммы | 245 |
| 22.3. Обрезанные дейтаграммы | 246 |
| 22.4. Когда UDP оказывается предпочтительнее TCP | 246 |
| 22.5. Добавление надежности приложению UDP | 247 |
| Если мы хотим использовать UDP для приложения типа «запрос-ответ», как было отмечено в предыд... | 247 |
| Пример | 248 |
| 22.6. Связывание с адресами интерфейсов | 252 |
| 22.7. Параллельные серверы UDP | 254 |
| 22.8. Информация о пакетах IPv6 | 255 |
| IPv6 позволяет приложению определять до пяти характеристик исходящей дейтаграммы: ■ IPv... | 255 |
| Исходящий и входящий интерфейсы | 256 |
| Адрес отправителя и адрес получателя IPv6 | 256 |
| Задание и получение предельного количества транзитных узлов | 256 |
| Задание адреса следующего транзитного узла | 256 |
| Задание и получение класса трафика | 256 |
| 22.9. Управление транспортной MTU IPv6 | 257 |
| IPv6 предоставляет приложениям средства для управления механизмом обнаружения транспортной MT... | 257 |
| Отправка с минимальной MTU | 257 |
| Получение сообщений об изменении транспортной MTU | 257 |
| Определение текущей транспортной MTU | 257 |
| Отключение фрагментации | 257 |
| 22.10. Резюме | 257 |
| Упражнения | 258 |
| Глава 23 Дополнительные сведения о сокетах SCTP | 258 |
| 23.1. Введение | 258 |
| 23.2. Сервер типа «один-ко-многим» с автоматическим закрытием | 258 |
| 23.3. Частичная доставка | 259 |
| 23.4. Уведомления | 260 |
| В разделе 9.14 уже отмечалось, что приложение может подписаться на уведомления, общее количес... | 260 |
| Запуск программы | 261 |
| 23.5. Неупорядоченные данные | 262 |
| 23.6. Связывание с подмножеством адресов | 262 |
| 23.7. Получение адресов | 263 |
| Поскольку протокол SCTP ориентирован на многоинтерфейсные узлы, для определения адресов локал... | 263 |
| Выполнение программы | 264 |
| 23.8. Определение идентификатора ассоциации по IP-адресу | 264 |
| 23.9. Проверка соединения и ошибки доступа | 265 |
| 23.10. Выделение ассоциации | 265 |
| 23.11. Управление таймерами | 266 |
| 23.12. Когда SCTP оказывается предпочтительнее TCP | 267 |
| 23.13. Резюме | 268 |
| Упражнения | 268 |
| Глава 24 Внеполосные данные | 268 |
| 24.1. Введение | 268 |
| 24.2. Внеполосные данные протокола TCP | 268 |
| В протоколе TCP нет настоящих внеполосных данных. Вместо этого в TCP предусмотрен так называе... | 268 |
| Простой пример использования сигнала SIGURG | 269 |
| Простой пример использования функции select | 271 |
| 24.3. Функция sockatmark | 272 |
| С приемом внеполосных данных всегда связана так называемая отметка внеполосных данных (out-of... | 272 |
| Пример: особенности отметки внеполосных данных | 272 |
| Пример: дополнительные свойства внеполосных данных | 273 |
| Пример: единственность отметки внеполосных данных в TCP | 274 |
| 24.4. Резюме по теме внеполосных данных TCP | 275 |
| 24.5. Резюме | 275 |
| Упражнения | 276 |
| Глава 25 Управляемый сигналом ввод-вывод | 276 |
| 25.1. Введение | 276 |
| 25.2. Управляемый сигналом ввод-вывод для сокетов | 276 |
| Для использования управляемого сигналом ввода-вывода с сокетом (SIGIO) необходимо, чтобы проц... | 276 |
| Сигнал SIGIO и сокеты UDP | 276 |
| Сигнал SIGIO и сокеты TCP | 276 |
| 25.3. Эхо-сервер UDP с использованием сигнала SIGIO | 277 |
| 25.4. Резюме | 280 |
| Упражнения | 280 |
| Глава 26 Программные потоки | 280 |
| 26.1. Введение | 280 |
| 26.2. Основные функции для работы с потоками: создание и завершение потоков | 281 |
| В этом разделе мы рассматриваем пять основных функций для работы с потоками, а в следующих дв... | 281 |
| Функция pthread_create | 281 |
| Функция pthread_join | 281 |
| Функция pthread_self | 281 |
| Функция pthread_detach | 281 |
| Функция pthread_exit | 282 |
| 26.3. Использование потоков в функции str_cli | 282 |
| 26.4. Использование потоков в эхо-сервере TCP | 283 |
| Теперь мы перепишем эхо-сервер TCP, приведенный в листинге 5.1, используя для каждого клиента... | 283 |
| Передача аргументов новым потокам | 283 |
| Функции, безопасные в многопоточной среде | 285 |
| 26.5. Собственные данные потоков | 285 |
| При преобразовании существующих функций для использования в многопоточной среде часто возника... | 285 |
| Пример: функция readline, использующая собственные данные потока | 287 |
| 26.6. Веб-клиент и одновременное соединение (продолжение) | 289 |
| 26.7. Взаимные исключения | 290 |
| 26.8. Условные переменные | 292 |
| 26.9. Веб-клиент и одновременный доступ | 294 |
| 26.10. Резюме | 295 |
| Упражнения | 295 |
| Глава 27 Параметры IP | 295 |
| 27.1. Введение | 295 |
| 27.2. Параметры IPv4 | 295 |
| 27.3. Параметры маршрута от отправителя IPv4 | 296 |
| Маршрут от отправителя (source route) — это список IP-адресов, указанных отправителем дейтагр... | 296 |
| Пример | 298 |
| Уничтожение полученного маршрута от отправителя | 300 |
| 27.4. Заголовки расширения IPv6 | 300 |
| 27.5. Параметры транзитных узлов и параметры получателя IPv6 | 300 |
| 27.6. Заголовок маршрутизации IPv6 | 303 |
| 27.7. «Закрепленные» параметры IPv6 | 305 |
| 27.8. История развития интерфейса IPv6 | 306 |
| 27.9. Резюме | 306 |
| Упражнения | 306 |
| Глава 28 Символьные сокеты | 306 |
| 28.1. Введение | 306 |
| 28.2. Создание символьных сокетов | 306 |
| 28.3. Вывод на символьном сокете | 307 |
| Вывод на символьном сокете регулируется следующими правилами: 1. Стандартный вывод выпо... | 307 |
| Особенности символьного сокета версии IPv6 | 307 |
| Параметр сокета IPV6_CHECKSUM | 307 |
| 28.4. Ввод через символьный сокет | 308 |
| Первый вопрос, на который следует ответить, говоря о символьных сокетах, следующий: какие из ... | 308 |
| Фильтрация по типу сообщений ICMPv6 | 308 |
| 28.5. Программа ping | 309 |
| 28.6. Программа traceroute | 315 |
| В этом разделе мы приведем собственную версию программы traceroute. Как и в случае с программ... | 315 |
| Пример | 321 |
| 28.7. Демон сообщений ICMP | 322 |
| Получение асинхронных ошибок ICMP на сокет UDP всегда было и продолжает оставаться проблемой.... | 322 |
| Эхо-клиент UDP, использующий демон icmpd | 323 |
| Примеры эхо-клиента UDP | 324 |
| Демон icmpd | 324 |
| 28.8. Резюме | 329 |
| Упражнения | 329 |
| Глава 29 Доступ к канальному уровню | 329 |
| 29.1. Введение | 329 |
| 29.2. BPF: пакетный фильтр BSD | 330 |
| 29.3. DLPI: интерфейс поставщика канального уровня | 331 |
| 29.4. Linux: SOCK_PACKET и PF_PACKET | 331 |
| 29.5. Libcap: библиотека для захвата пакетов | 331 |
| 29.6. Libnet: библиотека создания и отправки пакетов | 332 |
| 29.7. Анализ поля контрольной суммы UDP | 332 |
| Теперь мы приступаем к рассмотрению примера, в котором отсылается дейтаграмма UDP, содержащая... | 332 |
| Пример | 340 |
| Функции libnet | 340 |
| 29.8. Резюме | 341 |
| Упражнения | 342 |
| Глава 30 Альтернативное устройство клиента и сервера | 342 |
| 30.1. Введение | 342 |
| 30.2. Альтернативы для клиента TCP | 343 |
| 30.3. Тестовый клиент TCP | 343 |
| 30.4. Последовательный сервер TCP | 344 |
| 30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента | 344 |
| 30.6. Сервер TCP с предварительным порождением процессов без блокировки для вызова accept | 346 |
| В первом из рассматриваемых нами «усовершенствованных» серверов используется технология, назы... | 346 |
| Реализация 4.4BSD | 347 |
| Эффект наличия слишком большого количества дочерних процессов | 348 |
| Распределение клиентских соединений между дочерними процессами | 348 |
| Коллизии при вызове функции select | 349 |
| 30.7. Сервер TCP с предварительным порождением процессов и защитой вызова accept блокировкой файла | 349 |
| Описанная выше реализация, позволяющая нескольким процессам вызывать функцию accept на одном ... | 349 |
| Эффект наличия слишком большого количества дочерних процессов | 350 |
| Распределение клиентских соединений между дочерними процессами | 350 |
| 30.8. Сервер TCP с предварительным порождением процессов и защитой вызова accept при помощи взаимного исключения | 351 |
| 30.9. Сервер TCP с предварительным порождением процессов: передача дескриптора | 351 |
| 30.10. Параллельный сервер TCP: один поток для каждого клиента | 354 |
| 30.11. Сервер TCP с предварительным порождением потоков, каждый из которых вызывает accept | 355 |
| 30.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept | 356 |
| 30.13. Резюме | 357 |
| Упражнения | 358 |
| Глава 31 Потоки (STREAMS) | 358 |
| 31.1. Введение | 358 |
| 31.2. Обзор | 358 |
| Потоки обеспечивают двустороннее соединение между процессом и драйвером, как показано на рис.... | 358 |
| Типы сообщений | 359 |
| 31.3. Функции getmsg и putmsg | 359 |
| 31.4. Функции getpmsg и putpmsg | 360 |
| 31.5. Функция ioctl | 361 |
| 31.6. TPI: интерфейс поставщика транспортных служб | 361 |
| 31.7. Резюме | 366 |
| Упражнения | 366 |
| Приложения | 366 |
| Приложение А Протоколы IPv4, IPv6, ICMPv4 и ICMFV6 | 366 |
| А.1. Введение | 366 |
| А.2. Заголовок IPv4 | 366 |
| А.3. Заголовок IPv6 | 367 |
| А.4. Адресация IPv4 | 367 |
| Адреса IPv4 состоят из 32 разрядов и обычно записываются в виде последовательности из четырех... | 367 |
| Адреса подсетей | 368 |
| Адрес закольцовки | 368 |
| Неопределенный адрес | 368 |
| Частные адреса | 368 |
| Многоинтерфейсность и псевдонимы адресов | 369 |
| А.5. Адресация IPv6 | 369 |
| Адреса IPv6 содержат 128 бит и обычно записываются как восемь 16-разрядных шестнадцатеричных ... | 369 |
| Объединяемые глобальные индивидуальные адреса | 369 |
| Тестовые адреса 6bone | 370 |
| Адреса IPv4, преобразованные к виду IPv6 | 370 |
| Адреса IPv6, совместимые с IPv4 | 370 |
| Адрес закольцовки | 370 |
| Неопределенный адрес | 370 |
| Адрес локальной связи | 370 |
| Адрес, локальный на уровне сайта | 370 |
| А.6. ICMPv4 и ICMPv6: протоколы управляющих сообщений в сети Интернет | 370 |
| Приложение Б Виртуальные сети | 372 |
| Б.1. Введение | 372 |
| Б.2. MBone | 372 |
| Б.3. 6bone | 373 |
| Б.4. Переход на IPv6: 6to4 | 373 |
| Приложение В Техника отладки | 374 |
| Это приложение содержит некоторые рекомендации и описание методов отладки сетевых приложений. ... | 374 |
| В.1. Трассировка системных вызовов | 374 |
| Многие версии Unix предоставляют возможность трассировки (отслеживания) системных вызовов. За... | 374 |
| Сокеты ядра BSD | 374 |
| Сокеты ядра Solaris 9 | 374 |
| В.2. Стандартные службы Интернета | 375 |
| В.3. Программа sock | 375 |
| В.4. Небольшие тестовые программы | 376 |
| В.5. Программа tcpdump | 376 |
| В.6. Программа netstat | 376 |
| В.7. Программа lsof | 376 |
| Приложение Г Различные исходные коды | 376 |
| Г.1. Заголовочный файл unp.h | 376 |
| Г.2. Заголовочный файл config.h | 379 |
| Г.3. Стандартные функции обработки ошибок | 380 |
| Приложение Д Решения некоторых упражнений | 381 |
| Глава 1 | 381 |
| Глава 2 | 382 |
| Глава 3 | 382 |
| Глава 4 | 382 |
| Глава 5 | 382 |
| Глава 6 | 384 |
| Глава 7 | 384 |
| Глава 8 | 386 |
| Глава 9 | 387 |
| Глава 10 | 388 |
| Глава 11 | 388 |
| Глава 12 | 391 |
| Глава 13 | 391 |
| Глава 14 | 391 |
| Глава 15 | 392 |
| Глава 16 | 393 |
| Глава 17 | 393 |
| Глава 18 | 393 |
| Глава 20 | 393 |
| Глава 21 | 394 |
| Глава 22 | 394 |
| Глава 24 | 395 |
| Глава 25 | 396 |
| Глава 26 | 396 |
| Глава 27 | 396 |
| Глава 28 | 396 |
| Глава 29 | 397 |
| Глава 30 | 397 |
| Глава 31 | 397 |
| Литература | 397 |
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.