Лабораторная работа 6

Реализуйте клиент-серверное взаимодействие, использующее для передачи данных протокол TCP.

Клиент должен принимать два или более аргументов - имя хоста и имена каталогов. Клиент устанавливает TCP соединение с сервером по указанному имени хоста, после чего запрашивает у сервера содержимое указанных каталогов. Полученный список выводится на стандартный поток вывода.

Сервер должен обеспечивать возможность одновременного обслуживания нескольких клиентов. Протокол взаимодействия с сервером - текстовый. Необходимо предусмотреть возможность взаимодействия с сервером используя команду telnet.

Варианты:

Вариант Модель обслуживания Размер пула
1Одно соединение - один подпроцесс На каждое соединение создаётся новый подпроцессN/A
2 Для новых соединений используются заранее запущенные процессы из пулаФиксированный
3 Динамический. Если количество незанятых обслуживанием клиентов подпроцессов стало меньше N, должны создаваться новые, если стало больше K, "лишние" должны завершаться
4Одно соединение - один поток (нить) На каждое соединение создаётся новый потокN/A
5 Для новых соединений используются заранее запущенные потоки из пулаФиксированный
6 Динамический. Если количество незанятых обслуживанием клиентов потоков стало меньше N, должны создаваться новые, если стало больше K, "лишние" должны завершаться

Опционально:
Клиент при выводе должен сортировать содержимое каталогов по имени.

При выполнении работы могут быть полезны следующие man страницы:
opendir(3C), readdir(3C), closedir(3C), fork(2), pthread_create(3C), socket(3SOCKET), connect(3SOCKET), listen(3SOCKET), accept(3SOCKET), bind(3SOCKET).

Требования

Все файлы (исходный код, Makefile, исполнямые и объектные файлы, ...) должны быть в одном каталоге, для компиляции файлов должен быть написан Makefile, позволяющий перекомпилировать только изменённые файлы.