UNIX: разработка сетевых приложений
Шрифт:
3.10. Резюме
Структуры адресов сокетов являются неотъемлемой частью каждой сетевой программы. Мы выделяем для них место в памяти, заполняем их и передаем указатели на них различным функциям сокетов. Иногда мы передаем указатель на одну из этих структур функции сокета, и она сама заполняет поля структуры. Мы всегда передаем эти структуры по ссылке (то есть передаем указатель на структуру, а не саму структуру) и всегда передаем размер структуры в качестве дополнительного аргумента. Когда функция сокета заполняет структуру, длина также передается по ссылке, и ее значение может быть изменено функцией, поэтому мы называем такой аргумент «значение-результат» (value-result).
Структуры адресов сокетов являются самоопределяющимися, поскольку они всегда начинаются с поля
Две функции, преобразующие IP-адрес из формата представления (который мы записываем в виде последовательности символов ASCII) в численный формат (который входит в структуру адреса сокета) и обратно, называются
Сокеты TCP предоставляют приложению поток байтов, лишенный маркеров записей. Возвращаемое значение функции read может быть меньше запрашиваемого, но это не обязательно является ошибкой. Чтобы упростить считывание и запись потока байтов, мы разработали три функции
Упражнения
1. Почему аргументы типа «значение-результат», такие как длина структуры адреса сокета, должны передаваться по ссылке?
2. Почему и функция
3. Функции
Глава 4
Элементарные сокеты TCP
4.1. Введение
В этой главе описываются элементарные функции сокетов, необходимые для написания полностью работоспособного клиента и сервера TCP. Сначала мы опишем все элементарные функции сокетов, которые будем использовать, а затем в следующей главе создадим клиент и сервер. С этими приложениями
мы будем работать на протяжении всей книги, постоянно их совершенствуя (см. табл. 1.3 и 1.4).Мы также опишем параллельные (concurrent) серверы — типичную технологию Unix для обеспечения параллельной обработки множества клиентов одним сервером. Подключение очередного клиента заставляет сервер выполнить функцию
На рис. 4.1 представлен типичный сценарий взаимодействия, происходящего между клиентом и сервером. Сначала запускается сервер, затем, спустя некоторое время, запускается клиент, который соединяется с сервером. Предполагается, что клиент посылает серверу запрос, сервер этот запрос обрабатывает и посылает клиенту ответ. Так продолжается, пока клиентская сторона не закроет соединение, посылая при этом серверу признак конца файла. Затем сервер закрывает свой конец соединения и либо завершает работу, либо ждет подключения нового клиента.
Рис. 4.1. Функции сокетов для элементарного клиент-серверного соединения TCP
4.2. Функция socket
Чтобы обеспечить сетевой ввод-вывод, процесс должен начать работу с вызова функции
Константа
Таблица 4.1. Константы протокола (family) для функции socket
Семейство сокетов (family) | Описание |
---|---|
AF_INET | Протоколы IPv4 |
AF_INET6 | Протоколы IPv6 |
AF_LOCAL | Протоколы доменных сокетов Unix (см. главу 14) |
AF_ROUTE | Маршрутизирующие сокеты (см. главу 17) |
AF_KEY | Сокет управления ключами |
Таблица 4.2. Тип сокета для функции socket
Тип (type) | Описание |
---|---|
SOCK STREAM | Потоковый сокет |
SOCK_DGRAM | Сокет дейтаграмм |
SOCK_SEQPACKET | Сокет последовательных пакетов |
SOCK_RAW | Символьный (неструктурированный) сокет |
Таблица 4.3. Возможные значения параметра protocol