~square_root_server
Клиент-серверное приложение для нахождения корней квадратного уравнения
a*x^2 + b*x + c = 0
Приложение состоит из клиентской части, которая принимает от пользователя коэффициенты a, b, c, и выводит результат, и серверной части, которая вычисляет результат.
Клиентская часть соединяется с серверной частью по протоколу TCP, передает на сервер коэффициенты a, b, c.
Серверная часть вычисляет результат, и отправляет его обратно клиентской части, после чего соединение закрывается.
При невозможности вычисления корней должно выводиться соответствующее сообщение.
Разработать и описать протокол общения между клиентской и серверной частями приложения. Протокол должен состоять из запросов и ответов определенного формата.
Варианты реализации протокола:
- двоичный протокол (сериализация чисел с плавающей точкой с учетом порядка байт, присущего платформе - big/little endian)
- текстовый протокол (использование sprintf()/sscanf())
Серверная часть принимает и обрабатывает входящие запросы последовательно.
~udp_chat_duplex
Чат-приложение, использующее датаграммный протокол UDP.
Приложение обеспечивает двусторонний обмен сообщениями в режиме реального времени. При старте приложения указывается три параметра:
порт привязки локального экземпляра программы, адрес и порт привязки удаленного экземпляра.
Сообщения считываются с терминала и выводятся на терминал.
Для организации одновременного ожидания данных с терминала и сокета использовать функцию select().
~chat_server
Сервер простого чат-протокола.
Сервер принимает подключения от клиентов, идентифицируя их по никам (nickname), принимает от клиентов сообщения и переправляет их адресатам.
Если новый клиент указывает ник уже подключенного клиента, то сервер не разрешает ему подключение.
Сообщение может быть адресовано или одному клиенту (приват) или всем сразу, кто сейчас подключен.
Кроме сообщений клиенты получают уведомления о присоединении и отсоединении клиентов. Клиент может запрашивать полный список подключенных клиентов на сервере.
Сервер должен поддерживать массив присоединенных клиентов с их никами.
Использовать отладочный вывод данных в лог-файл.
Описание протокола:
Сообщения протокола - это текстовые строки, заканчивающиеся символом '\n' (перевод строки).
Сообщения протокола являются командами, если начинаются с символа '/'.
В противном случае, эти сообщения являются публичными сообщениями от клиента всем участникам.
Команды с параметрами и пример интерактивной сессии приведены ниже.
Знаком < помечен ввод пользователя, знаком > помечена выдача сервера.
telnet 127.0.0.1 4577
Connected.
<"privet\n"
>"/error say_login\n"
<"/privet\n"
>"/error unknown_command\n"
<"/login petya\n"
>"/error login_in_use\n"
<"/login vasya\n"
>"/userlist vasya petya masha dasha\n"
<"privet vsem!\n"
>"/msg vasya privet vsem!\n"
<"/private petya zdorovo petro, kak zhizn'?\n"
>"/private petya normul :)\n"
>"/status gogi joined\n"
>"/msg gogi ashambeh-mashambeh...\n"
<"/userlist\n"
>"/userlist gogi vasya petya masha dasha\n"
>"/status gogi left\n"
<"/userlist\n"
>"/userlist vasya petya masha dasha\n"
<"/logout\n"
Disconnected.
~chat_client
Клиентское чат-приложение, использующее простой протокол датаграммный протокол UDP.
Приложение обеспечивает двусторонний обмен сообщениями в режиме реального времени. При старте приложения указывается три параметра:
порт привязки локального экземпляра программы, адрес и порт привязки удаленного экземпляра.
Сообщения считываются с терминала и выводятся на терминал.
Для организации одновременного ожидания данных с терминала и сокета использовать функцию select().
~tcp_getfile_select
Передача файла с сервера на клиент по простому протоколу на основе TCP.
Входящие запросы обрабатываются параллельно, используя функцию select().
Протокол должен состоять из запросов и ответов.
В запросе от клиента должно указываться имя файла на сервере, который должен быть отправлен клиенту.
В ответе от сервера должен значиться код ответа для различения нормальных и ошибочных ситуаций и сами данные из запрашиваемого файла.
Функция select() позволяет дождаться события, то есть готовности файлового дескриптора по записи или чтению. Например, если она сигнализирует о готовности некоторого сокета по записи, это означает, что как минимум один вызов write() для этого сокета не будет блокирующим.
Задача в том, чтобы параллельные запросы по скачиванию достаточно длинных файлов выполнялись сервером псевдо-параллельно.
~udp_getfile
Написать программу, состоящую из клиентской и серверной частей, которая будет скачивать указанный клиентом файл с сервера, используя протокол UDP.
Обе части можно оформить в виде консольных приложений
Win32 или POSIX. Язык: ANSI С.
Серверная часть запускается и ждет запроса на определенном порту.
Клиентская часть запускается пользователем из командной строки со следующими примерными параметрами.
./download_by_udp localhost 12345 /my_docs/info.txt ./downloads/info.txt
где localhost 12345 - хост и порт серверного UDP сокета
/my_docs/info.txt - файл на стороне сервера, который мы хотим скачать.
./downloads/info.txt - файл на стороне клиента, куда будет записан скачанный файл.
Предусмотреть обработку ошибок типа: нет соединения, файл не найден и т.д.
Так, как передача данных будет происходить по датаграммному протоколу, необходимо будет предусмотреть разбиение передаваемых данных на датаграммы, и их надежную доставку.
Т.е. в некотором смысле эмулировать работу TCP.
Лиература:
http://rsdn.ru/article/unix/sockets.xml
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.