Важное замечание: все (именно ВСЕ и во всех вариантах) лабораторные работы работают на одном комьютере, т.е. для выполнения всех лабораторных работ компьютерная сеть не нужна. Для ознакомления с принципами работы Windows Sockets API v. 2.02 изучите работу и исходные коды написанной мною базовой клиент-серверной пары "Простой эхо-сервер для одновременной работы с несколькими клиентами" и "Клиент для него". Исходный код очень прост и понятен, а также снабжён необходимыми комментариями. Что непонятно, смотрите в MSDN в разделе
MSDN 6.0/Platform SDK/Networking and Distributed Services/
Windows Sockets version 2 / Windows Sockets version 2 API / Reference (Всё
остальное в разделе Windows Sockets version 2 API можно
вообще не смотреть - нет смысла).
На базе этой клиент-серверной пары построены все лабораторные работы. В принципе всё сетевое взаимодействие в этих лабораторных работах сводится к посылке определённых команд в определённом формате и получению ответов на них.
Эти лабораторные работы = клиент-серверная пара + системное программирование + некоторые RFC (прилагаются).
И если всё-таки что-то останется непонятно, то можно ещё скачать и почитать книгу "Программирование в сетях Microsoft Windows (Джонс А., Оланд Дж.)" (На английском языке).
Как известно, бибилиотека компонентов Delphi или MFC содержит готовые решения многих, если не всех, этих серверов. Их лучше не использовать, потому что во время сдачи каждой лабораторной работы преподаватель всегда даёт дополнительное задание (запрограммировать прямо во время сдачи) - добавить какую-нибудь возможность, или исправить какую-нибудь ошибку.
Есть ещё и такой вариант - использовать исходные коды соответствующих серверов под Linux и перекомпилировать их под Windows. Этот вариант можно применить при условии досконального понимания их исходного кода.
Самая простая лабораторная работа. Суть её в том, что клиент и сервер обмениваются данными посредством сокетов. Сервер и клиент отправляют друг другу и получают содержимое буфера - обычного символьного массива - по принципу "один запрос - один ответ". Для выполнения лабораторной работы не требуется использовать какой-либо RFC. (Если будет большое желание, почитайте RFC-854 - Описание протокола Telnet). Для каждого клиента хранится свой текущий путь на сервере, поэтому если к серверу подключено одновременно несколько клиентов, то если ввести на одном клиенте команду "cd", то для других подключённых клиентов текущий путь на сервере не изменится. Сервер посылает клиенту перед каждой командой приглашение ввести команду. Ещё одна тонкость: Стандартная windows-программа telnet.exe не даёт возможности ввести команду целиком и отправить её на сервер, программа каждую введённую букву немедленно отправляет на сервер. Для преодоления этой проблемы используется специальная функция ввода на сервере, которая каждую полученую от клиента букву команды немедленно отправляет обратно клиенту до тех пор, пока не получит символ перевода строки. Поэтому вводимая команда побуквенно появляется у клиента. Только после получения символа перевода строки сервер обрабатывает всю собранную у себя по буквам команду (с аргументами, если есть).
Скачать лабораторную работу № 1 (78,8 КБ)
Необходимые RFC: 821, 822, 1123.
Третья из всех по уровню сложности лабораторная работа. Важным нововведением по сравнению с лабораторной работой № 1 является изменение правила оценивания размера отправляемого клиенту заполненного буфера. Если в лабораторной работе № 1 размер посылаемого клиенту буфера определялся как sizeof(Buffer), то в этой лабораторной работе - как strlen(Buffer). Это изменение критично для работы этой и всех последующих лабораторных работ, потому что формат получаемого клиентом сообщения строго определён во всех RFC. Во всех RFC, применяемых в этих лабораторных работах, написано, что клиент на свой запрос должен получить ответ от сервера в виде строки, оканчивающейся парой <CR><LF>. При этом неявно подразумевается, что после пары <CR><LF> не должно быть ни единого байта.
Основная сложность этой лабораторной работы - организовать пересылку (forwarding) электронного письма со одного SMTP-сервера на другой. Пересылка выглядит так: Microsoft Outlook Express шлёт письмо одному SMTP-серверу, т.е. на который настроена Outlook'овская учётная запись, и он, этот SMTP-сервер по адресу письма определяет, то ли оставить полученное письмо себе, то ли переслать его дальше, другому SMTP-серверу. Для определения судьбы письма используется его адрес в формате <имя_пользователя>@<домен>. У каждого SMTP-сервера должен быть свой домен. Например, адрес box@mailserver1.com имеет такие части: "box" - имя пользователя (или почтовый ящик), "mailserver1.com" - домен данного SMTP-сервера.
Скопируйте исполняемый файл в папку, где находится файл "conf.inf". Для организации пересылки письма на одном компьютере (в смысле, без использования сети) настройте учётную запись Microsoft Outlook Express: в поле SMTP-сервер введите ip-адрес вашего компьютера (например, 10.144.22.136) и порт: 25. Затем скопируйте в другую папку исполняемый файл SMTP-сервера, папки "box" и "my" и файл "Для forwarding. Скопировать и переименовать в ''conf''.inf" (его после этого нужно переименовать в "conf.inf"). Файл "conf.inf" используется в этой и всех последующих лабораторных работах. В нём хранится конфигурация сервера. При запуске программа считывает настройки из этого файла. Можете изменить настройки, если нужно. Например, последнее поле файла "conf.inf" определяет, будут ли выводиться на экран все получаемые сервером команды и отправляемые клиенту ответы. При пересылке на одном компьютере можно настроить второй SMTP-сервер на ip-адрес 127.0.0.1 и на какой-либо порт, отличающийся от 25 (26, например), потому что 25 порт уже занят первым SMTP-сервером. В файле "Примеры адресов.txt" хранятся примеры адресов, по которым можно отправить e-mail. (С учётом имеющихся настроек в файлах "conf.inf"). Запустите оба исполняемых файла. Теперь вы можете просмотреть и/или изменить настройки сервера путём ввода соответствующих команд. Для информации о командах наберите команду "help". Запустите оба сервера командой "start" (или " ' ", что удобней). Настроив, как было описано, учётную запись Microsoft Outlook Express, создайте новое сообщение, и в поле "Кому:" из файла "Примеры адресов.txt" вставьте запись box@mailserver1.com, my@mailserver1.com, box@mailserver2.com, my@mailserver2.com". В поле "Тема:" и в теле сообщения - всё, что угодно. Отправьте сообщение. Оно исчезнет в Microsoft Outlook Express и попадёт в соответствующие почтовые ящики на 2 SMTP-серверах, т.е. всего получится 4 полученных e-mail'а: по одному в ящиках "box" и "my" на "mailserver1.com" (т.е. по настройкам "conf.inf" на 1 SMTP-сервере) и в ящиках "box" и "my" на "mailserver2.com" (т.е. по настройкам "conf.inf" на 2 SMTP-сервере). Пришедшие 4 e-mail'а будут иметь одинаковые названия в виде соответствующих дат подключения, например, "e-mail from Mon Dec 29 23-30-05 2003". После закрытия программы протокол клиент-серверного обмена команд можно посмотреть в файле "smtp_report.txt". Выполненная лабораторная работа соответствует требованиям минимальной реализации, описанным в RFC-821. Что касается RFC-822, то его можно вообще не читать и всё равно успешно сделать эту лабораторную работу.
Скачать лабораторную работу № 2 (84,5 КБ)
Необходимые RFC: 1225, 822.
Вторая из всех по уровню сложности лабораторная работа. Она довольно проста. Сделана по материалам предыдущих работ. При доставке писем файлы-письма уничтожаются, поэтому запасные письма находятся в архивах "box.exe" и "my.exe". Ничего особо интересного об этой лабораторной работе нельзя сказать. Выполненная лабораторная работа соответствует требованиям минимальной реализации, описанным в RFC-1225. Что касается RFC-822, то его можно вообще не читать и всё равно успешно сделать эту лабораторную работу.
Скачать лабораторную работу № 3 (147 КБ)
Необходимые RFC: 959, 2616, необязательные - 2068, 943, 1639.
Самая сложная из всех лабораторная работа. Фактически, это две лабораторных работы в одной, т.к. в этой работе реализованы FTP-сервер и HTTP-сервер.
Основная сложность этой лабораторной работы была в том, чтобы реализовать механизм прав доступа, а вовсе не в реализации протоколов FTP и HTTP. Реализован Unix-подобный механизм прав доступа,и то далеко не полностью, а реализованы только 2 права: All - r (Запрет на скачивание) и All - x (для каталогов, запрет просмотра). И еще изменять права на файл или папку может только владелец или админ "root". Кстати, создавать админа "root" совсем не обязательно в этой лабораторной работе. Также в этой работе реализованы текстовый и бинарный режимы передачи данных, активный и пассивный режимы подключения, основные файловые операции. Для каждой папки права доступа на файлы и папки записаны в служебном файле "rights.inf", который есть в каждой папке (кроме папки Debug, которая вообще не участвует в работе FTP-сервера). Исполняемый файл серверов должен находиться в той же папке, где и папка "Debug" (Так уже сделано). Стартовая папка, т.е.та, в которой находится папка "Debug", считается корневой папкой FTP-сервера и домашней папкой админа "root". Выход выше корневой папки при навигации по FTP-серверу заблокирован. Это сделано для упрощения (Чтобы не создавать в каждой папке, которую мы посетим, файл "rights.inf"). Пользователем считается папка с файлом "password.inf " внутри. Пользователь при подключении к FTP-серверу сразу же попадает в свою домашнюю папку.
Внимание! Для обеспечения правильной работы FTP-сервера запрещается вручную создавать или удалять любые файлы или папки в корневой папке. Все необходимые файловые операции можно осуществлять только из работающей программы, в том числе создание-удаление пользователей, иначе нарушится корректность файла "rights.inf". В случае нарушения запрета программа сразу же начнёт некорректно работать. Для устранения возникшей проблемы удалите всех пользователей (т.е. их домашние папки) и файл "rights.inf", находящийся в корневой папке. После этого запустите программу и создайте удалённых пользователей одним из двух способов: или же через соответствующие команды консоли (справка - команда "Help"), или же через HTTP-соединение (см. далее "Описание HTTP-реализации").
HTTP-сервер - это самый простой сервер из всех протокольных. В ответ на запрос он просто шлёт текстовые строки htm-файла, заканчивающиеся CRLF. HTTP-сервер запускается сразу же после запуска программы. Весь код для него содержится в файле "http_plugin.cpp". Настройки HTTP-сервера хранятся в файле "http_conf.inf". Клиентом для HTTP-сервера служит файл "http_client.htm". Он отправляет HTTP-серверу запрос на посылку формы на добавление или удаление пользователя. Сервер присылает эту форму - она является аналогичным htm-файлом. Заполняем её поля, отправляем и в FTP-клиенте нажимаем Ctrl+R, чтобы увидеть результат.
Для этой лабораторной работы использовался Far
Manager v. 1.70 beta 5 (build 1634) и встроенный в него FTP-клиент
(Apr 1 2003, 05:52:05). Дистрибутив этого Far Manager'а я взял в
локальной сети кафедры. Имейте в виду, что у
FTP-клиента Far Manager'а от версии к версии меняется
состав поддерживаемых команд и формат
принимаемых ответов. Так что никаких гарантий
насчёт того, что эта лабораторная работа будет
работать с будующими версиями Far Manager'а, дать не
могу. Поэтому, если будете делать эту
лабораторную работу самостоятельно, то первое, с
чего нужно начать - это установить у себя дома ту
версию Far Manager'а, которая стоит на институтских
компьютерах. Можно в крайнем случае взять не сам
Far Manager, а только его FTP-клиент (...../Far/Plugins/Ftp).
Установив нужную версию Far Manager, во-первых,
давайте переключим язык интерфейса с
английского на русский. Это делается так: F9 - Options -
Languages - выбираете русский и т. д. Затем нужно
сохранить параметры: F9 - Параметры - Сохранить
параметры.
Far Manager имеет на самом деле 2 FTP-клиента: консольный
и оконный. Для лабораторной работы используется
оконный FTP-клиент.
Панель оконного FTP-клиента Far Manager можно открыть по F11. Я поставил на него по F4 "горячую клавишу" - "-". Теперь для открытия панели оконного FTP-клиента нужно нажать всего лишь " F11, - ". Новый адрес вводится нажатием Shift+F4, старый редактируется по F4. В числе прочих настроек можно установить активный или пассивный режим соединения и расширенное окно команд (рекомендуется). Для этой лабораторной работы создайте такие 4 записи о подключениях: "box:123@127.0.0.1", "user123@127.0.0.1", "root:password@127.0.0.1" и запись "new:123@127.0.0.1" , пользователя для которой мы создадим из HTTP-клиента. При создании/удалении пользователя из HTTP-клиента необходимо обновлять панель в FTP-клиенте нажатием Ctrl+R. Вызов меню смены прав доступа делается по Ctrl+A. Для отображения в окне Far Manager содержимого какой-либо папки FTP-сервера необходимо посылать записи о вложенных файлах и папках строго по синтаксису, который применяется для отображения результатов команды "просмотр папки" в соответствующей ОС. Для Unix (чей формат используется в этой лабораторной) это "ls -l", а для DOS - "dir".
Запускаем Far Manager и вводим "ftp+Enter". Вводим команду "help" (команды можно сокращать, так что достаточно ввести "he"). Консольный FTP-клиент Far Manager в этой лабораторной работе НЕ используется, потому что он поддерживает ограниченный набор самых необходимых команд. Он не поддерживает, к примеру, пассивный режим. Подробности о консольном FTP-клиенте Far Manager смотрите в составленном мною перечне Команды консольного FTP-клиента Far Manager.
Скачать лабораторную работу № 4 (166 КБ)