Упражнения

Упражнения

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 и среднего отклонения.

Данный текст является ознакомительным фрагментом.