Книга: UNIX: разработка сетевых приложений
Упражнения
Упражнения
1. Почему в листинге 22.16 функция printf
вызывается дважды?
2. Может ли когда-нибудь функция dg_send_recv
(см. листинги 22.6 и 22.7) возвратить нуль?
3. Перепишите функцию dg_send_recv
с использованием функции select
и ее таймера вместо alarm
, SIGALRM
, sigsetjmp
и siglongjmp
.
4. Как может сервер IPv4 гарантировать, что адрес отправителя в его ответе совпадает с адресом получателя клиентского запроса? (Аналогичную функциональность предоставляет параметр сокета IPV6_PKTINFO
.)
5. Функция main
в разделе 22.6 является зависящей от протокола (IPv4). Перепишите ее, чтобы она стала не зависящей от протокола. Потребуйте, чтобы пользователь задал один или два аргумента командной строки, первый из которых — необязательный IP-адрес (например, 0.0.0.0 или 0::0), а второй — обязательный номер порта. Затем вызовите функцию udp_client
, чтобы получить семейство адресов, номер порта и длину структуры адреса сокета.
Что произойдет, если вы вызовете функцию udp_client
, как было предложено, не задавая аргумент hostname
, поскольку функция udp_client
не задает значение AI_PASSIVE
функции getaddrinfo
?
6. Соедините клиент, показанный в листинге 22.4, с эхо-сервером через Интернет, изменив функции rtt_
так, чтобы выводилось каждое значение RTT. Также измените функцию dg_send_recv
, чтобы она выводила каждый полученный порядковый номер. Изобразите на графике полученные в результате значения RTT вместе с оценочными значениями RTT и среднего отклонения.
- 22.1. Введение
- 22.2. Получение флагов, IP-адреса получателя и индекса интерфейса
- 22.3. Обрезанные дейтаграммы
- 22.4. Когда UDP оказывается предпочтительнее TCP
- 22.5. Добавление надежности приложению UDP
- 22.6. Связывание с адресами интерфейсов
- 22.7. Параллельные серверы UDP
- 22.8. Информация о пакетах IPv6
- 22.9. Управление транспортной MTU IPv6
- 22.10. Резюме
- Упражнения