Закрываются сокеты так же, как и обычные дескрипторы файлового ввода/вывода, - при помощи системного вызова close(). Для сокета SOCK_STREAM ядро гарантирует, что все записанные в сокет данные будут переданы принимающему процессу.
Данные операции выполняются и в программе сервера, и в программе клиента.
Варианты заданий
1. Эмуляция DNS сервера. Клиент подсоединяется к серверу, IP которого хранится в файле dns.url, и делает ему запрос на подключение к серверу "Имя сервера". DNS-сервер имеет список, хранящийся в файле о соответствии имен серверов и IP-адресов. Если в списке нет "имени сервера", запрошенного клиентом, то сервер DNS подключается последовательно к другим серверам, хранящимся в файле dns.url, и т.д. Если сервер не найден, клиенту возвращается соответствующее сообщение.
2. Организовать чат. К серверу подключаются клиенты. При подключении клиента сервер спрашивает имя, под которым клиент будет известен в соединении. Сервер хранит IP-адреса подключаемых клиентов и их имена. Все сообщения каждого клиента рассылаются остальным в виде "имя_клиента - сообщение". Сообщения рассылаются сервером всем клиентам также при вхождении в связь нового клиента, и выходе какого-либо клиента.
3. Организовать взаимодействие типа клиент-сервер. Клиенты подключаются к первому серверу и передают запрос на получение определенного файла. Если этого файла нет, сервер подключается ко второму серверу и ищет файл там. Затем либо найденный файл пересылается клиенту, либо высылается сообщение, что такого файла нет.
4. Организовать взаимодействие типа клиент-сервер. Клиент отсылает строку серверу. Сервер отсылает данную строку на другие сервера, список которых хранится в файле, а там уже осуществляется поиск файлов содержащих данную строку. Результаты поиска отсылаются клиенту.
5. Организовать взаимодействие типа клиент-сервер. Сервер при подключении к нему нового клиента высылает список IP-адресов уже подключенных клиентов. А остальным клиентам рассылается сообщение в виде IP-адреса о том, что подключился такой-то клиент.
6. Организовать взаимодействие типа клиент-сервер. К серверу одновременно может подключиться только один клиент. Остальные клиенты заносятся в очередь, и им высылается сообщение об ожидании освобождения сервера.
7. Организовать взаимодействие типа клиент-сервер. Клиент при входе в связь с сервером должен ввести пароль. Разрешено сделать три попытки. Если пароль не верен, сервер должен блокировать IP-адрес клиента на 5 минут.
8. Сервер, моделирующий работу примитивной СУБД, хранит единственную таблицу в оперативной памяти. Клиенты подключаются к серверу, чтобы получить подробную информацию об хранящихся в таблице объектах. Для этого клиенты пересылают серверу строку, являющуюся уникальным ключом, который однозначно характеризует какой-либо объект, хранящийся в таблице. Сервер ищет в таблице объект с таким ключом и возвращает клиенту полную информацию об объекте, либо сообщает об отсутствии искомого объекта.
9. Организовать взаимодействие типа клиент-сервер. Клиент делает запрос серверу на выполнение какой-либо команды. Сервер выполняет эту команду и возвращает результаты клиенту.
10. Организовать взаимодействие типа клиент-сервер. Клиент делает запрос серверу о передаче файлов с определенным расширением из указанной директории. Сервер сканирует указанную директорию и отправляет клиенту список файлов, удовлетворяющих запросу.
Контрольные вопросы
1. Какова структура IP-адреса?
2. Как поместить и извлечь IP-адрес из структуры сокета?
3. В чем разница между моделями TCP-соединения и дейтаграмм?
4. Каковы основные шаги межпроцессного взаимодействия в модели TCP-соединения?
5. Каковы основные шаги межпроцессного взаимодействия в модели дейтаграмм?
6. Как занести в структуру сокета IP-адрес своего компьютера?
7. Каким образом извлечь информацию о клиенте после установки TCP-соединения?
8. Какова реакция системных вызовов посылки и приема сообщений в модели TCP-соединения при разрыве связи?