Книга: UNIX: разработка сетевых приложений
Упражнения
Упражнения
1. Что произойдет, если доменный сервер Unix вызовет функцию unlink
после вызова функции bind
?
2. Что произойдет, если доменный сервер Unix при завершении не отсоединит с помощью функции unlink
свое известное полное имя, а клиент будет пытаться с помощью функции connect
соединиться с сервером через некоторое время после того, как тот завершит работу?
3. Измените листинг 11.5 так, чтобы после того как будет выведен адрес протокола собеседника, вызывалась бы функция sleep(5)
, а также чтобы вывести число байтов, возвращаемых функцией read
всякий раз, когда она возвращает положительное значение. Измените листинг 11.8 так, чтобы для каждого байта результата, отправляемого клиенту, вызывалась функция write
. (Мы обсуждаем подобные изменения в решении упражнения 1.5.) Запустите клиент и сервер на одном узле, используя TCP. Сколько байтов считывает клиент с помощью функции read
?
Запустите клиент и сервер на одном узле, используя доменный сокет Unix. Изменилось ли что-нибудь?
Теперь для сервера вместо функции write вызовите функцию send
и задайте флаг MSG_EOR
(чтобы выполнить это упражнение, вам нужно использовать Беркли-реализацию). Запустите клиент и сервер на одном узле, используя доменный сокет Unix. Изменилось ли что-нибудь?
4. Напишите программу, определяющую значения, показанные в табл. 4.6. Один из подходов — создать потоковый канал и затем с помощью функции fork
разветвить родительский и дочерний процессы. Родительский процесс входит в цикл for
, увеличивая на каждом шаге значение backlog
от 0 до 14. Каждый раз при прохождении цикла родительский процесс сначала записывает значение backlog
в потоковый канал. Дочерний процесс читает это значение, создает прослушиваемый сокет, связанный с адресом закольцовки, и присваивает backlog
считанное значение. Затем дочерний процесс делает запись в потоковый канал просто для того, чтобы сообщить родительскому процессу о своей готовности. Затем родительский процесс пытается установить как можно больше соединений, задав предварительно аргумент функции alarm
равным 2 с, поскольку при достижении предельного значения backlog
вызов функции connect заблокируется, и отправляет еще раз сегмент SYN
. Дочерний процесс никогда не вызывает функцию accept
, что позволяет ядру установить в очередь все соединения с родительским процессом. Когда истекает время ожидания родительского процесса (аргумент функции alarm
, в данном случае 2 с), по счетчику цикла он может определить, какая по счету функция connect
соответствует предельному значению backlog
. Затем родительский процесс закрывает свои сокеты и пишет следующее новое значение в потоковый канал для дочернего процесса. Когда дочерний процесс считывает новое значение, он закрывает прежний прослушиваемый сокет и создает новый, заново начиная процедуру.
5. Проверьте, вызывает ли пропуск вызова функции bind
в листинге 15.6 ошибку сервера.
- 15.1. Введение
- 15.2. Структура адреса доменного сокета Unix
- 15.3. Функция socketpair
- 15.4. Функции сокетов
- 15.5. Клиент и сервер потокового доменного протокола Unix
- 15.6. Клиент и сервер дейтаграммного доменного протокола Unix
- 15.7. Передача дескрипторов
- 15.8. Получение информации об отправителе
- 15.9. Резюме
- Упражнения