Книга: UNIX: разработка сетевых приложений
Упражнения
Упражнения
1. Мы говорили, что набор дескрипторов можно присвоить другому набору дескрипторов, используя оператор присваивания языка С. Как это сделать, если набор дескрипторов является массивом целых чисел? (Подсказка: посмотрите на свой системный заголовочный файл <sys/select.h>
или <sys/types.h>
.)
2. Описывая в разделе 6.3 условия, при которых функция select
сообщает, что дескриптор готов для записи, мы указали, что сокет должен быть неблокируемым, для того чтобы операция записи возвратила положительное значение. Почему?
3. Что произойдет с программой из листинга 6.1, если мы поставим слово else
перед if
в строке 19?
4. В листинге 6.3 добавьте необходимый код, чтобы позволить серверу использовать максимальное число дескрипторов, допустимое ядром (Подсказка: изучите функцию setrlimit
.)
5. Посмотрите, что происходит, если в качестве второго аргумента функции shutdown
передается SHUT_RD
. Возьмите за основу код клиента TCP, представленный в листинге 5.3, и выполните следующие изменения: вместо номера порта SERV_PORT
задайте порт 19 (служба chargen
, см. табл. 2.1), а также замените вызов функции str_cli
вызовом функции pause
. Запустите программу, задав IP-адрес локального узла, на котором выполняется сервер chargen
. Просмотрите пакеты с помощью такой программы, как, например, tcpdump
(см. раздел В.5). Что происходит?
6. Почему приложение должно вызывать функцию shutdown
с аргументом SHUT_RDWR
, вместо того чтобы просто вызвать функцию close
?
7. Что происходит в листинге 6.4, когда клиент отправляет RST для завершения соединения?
8. Перепишите код, показанный в листинге 6.5, чтобы вызывать функцию sysconf
для определения максимального числа дескрипторов и размещения соответствующего массива client
в памяти.