Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетУказКурсРабСистемПрогрЗИЭИТ2005.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
698.37 Кб
Скачать

Ожидание и обработка событий

По умолчанию сокет, созданный функцией socket() , является блокирующим, т.е. вызов функции recvfrom() приостанавливает выполнение потока до тех пор, пока не придет дейтаграмма. Во многих случаях бывает необходимо, чтобы приложение параллельно с ожиданием дейтаграммы продолжало выполнять другие операции. Для этого в WinSock имеются два метода асинхронного приема данных: BSD-совместимая функция select() и специфическая для WinSock функция WSAAsyncSelect().

Использование функции wsaAsyncSelect()

Рассмотренное выше применение функции select() является простейшим методом обмена данными с системой UNIX. Для приложений Windows WinSock предлагает функцию WSAAsyncSelect(), которая определяет сообщение, посылаемое в приложение при определенных событиях.

int WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);

Параметр hWnd указывает на окно, в которое посылается сообщение, указанное в параметре wMsg. Обычно это сообщение, определенное пользователем (WM_USER+n). Последний параметр lEvent, указывает события, о которых интерфейс должен посылать сообщения. Это значение образуется путем сложения следующих логических констант:

FD_READ

Данные ожидают во входной очереди

FD_WRITE

Сокет готов к записи

FD_OOB

Готовность к считыванию привилегированных данных

FD_ACCEPT

Ожидание ответа на запрос о соединении

FD_CONNECT

Соединение с сокетом успешно открыто

FD_CLOSE

Соединение закрыто

Функция WSAAsyncSelect() автоматически активизирует сокет в не блокирующем режиме.

Приложение 2. Команды ftp

Команды FTP основаны на тексте, и пользователь, сидя у терминала, может внести их с помощью командной строки клиента FTP. Аналогично ответы, которые сервер возвращает, основаны на тексте и пригодны для чтения.

Все команды FTP завершаются стандартным сочетанием символов возврата каретки и новой строки (#13#10), Ответ каждой из этих команд содержит число из трех цифр в качестве первого фрагмента информации в ответе. Три цифры закодированы так, чтобы указывать на успешное выполнение команды или сбой и дать представление о характере команды.

Первая цифра кода ответа определяет характер ответа. В табл. А1 перечислены значения для первой цифры.

Таблица А1 . Значения первой цифры кодов ответа FTP

Значение

Что означает

1

Положительный начальный ответ. Запрашиваемая команда инициализируется, и по завершении ее должен быть получен другой код ответа, указывающий о выполнении команды

2

Ответ о положительном завершении. Запрашиваемая команда успешно завершена

3

Положительный временный ответ. Запрашиваемая команда исправна, однако от клиента требуется дополнительная информация или действие

4

Ответ об отрицательном завершении. Выполнение запрашиваемой команды не завершено. Клиенту предлагается повторить команду снова

5

Ответ о постоянном отрицательном завершении команды. Запрашиваемая команда не выполнялась и не может быть выполнена. Клиенту не предлагается повторять команду снова.

Вторая цифра в кодах ответа показывает функциональную область, в которой выполняется команда. В табл. А2 перечислены эти значения

Таблица А2. Значения второй цифры кода ответов FTP

Значение

Что означает

0

Синтаксис. Эти ответы относятся к синтаксическим ошибкам или используются в качестве обобщенных ответов ОК

1

Информация. Эти ответы являются ответами на запросы информации

2

Соединения. Эти ответы относятся к соединениям управления и данных

3

Аутентификация и учет. Эти ответы являются откликами для процедур регистрации обработки и учета

4

Не указан

5

Файловая система. Эти ответы указывают статус файловой системы сервера и передачи запрашиваемого файла или иное действие файловой системы

Третья цифра в кодах ответа придает более высокую степень специфичности ответам.

Команды доступа

Первый набор команд состоит из тех команд, которые подсоединяют и регистрируют на сервере FTP.

Подсоединение к FTP. Первая команда фактически является не командой, а скорее, ответом, который сервер отправляет клиенту после подсоединения к порту 21 TCP. Если сервер занят и имеет много активных соединений, он может отбросить соединение (большинство серверов FTP ограничивают число одновременных соединений, которые они обслуживают). Если все в порядке и сервер работает с достаточным количеством соединений, следует получить код ответа 220, который сообщает, что вы подсоединены и должны перейти к процессу регистрации. Коды откликов: 120, 220, 421 (табл. АЗ).

Таблица А3. Коды откликов на команды FTP

Код

Значение

110

Этот код возвращается, когда осуществляется повторный запуск прерванной передачи файлов

120

Служба будет готова через указанное число минут

125

Соединение данных уже открыто и начинает передачу

150

Файл готов, и вскоре откроется соединение данных

200

ОК (обобщенный положительный ответ на команду)

202

Этот узел не реализует команду

211

Состояние системы или ответ подсказки

212

Состояние каталога

213

Состояние файла

214

Сообщение подсказки

215

Имя типа системы

220

Служба готова для нового подключения пользователя

221

Соединение закрывается

225

Соединение данных открыто, однако передача не выполняется

226

Соединение данных закрывается , потому что передача завершена или успешно выполнена

227

Ввод пассивного режима (адрес и номер порта для соединения данных). Сервер ждет, пока клиент не инициализирует соединение данных

230

Пользователь зарегистрирован

250

Запрашиваемое действие завершено

257

Имя каталога было создано или является текущим

331

Имя пользователя найдено, однако нужен пароль

332

Требуется учетная запись для регистрации

421

Служба отсутствует, поэтому соединение управления закрывается

425

Соединение данных не может быть открыто

426

Соединение данных закрыто, поэтому передача прервана

450

Файл не готов, поэтому запрашиваемое действие не выполнялось

451

Ошибка локальной обработки. Запрашиваемое действие прервано

452

Недостаточный объем памяти. Запрашиваемое действие не выполнялось

500

Синтаксическая ошибка. Команда не была признана

501

Синтаксическая ошибка в аргументах или параметрах команды

502

Команда не реализована

503

Ошибочная последовательность команд

504

Команда отсутствует для запрашиваемого параметра

530

Пользователь не зарегистрирован

532

Требуется учетная запись для хранения файлов на сервере

550

Запрашиваемое действие не было выполнено (файл не был обнаружен или в доступе было отказано)

551

Запрашиваемое действие прервано, поскольку тип страницы неизвестен

552

Действие прервано, поскольку оно превысило объем распределенной памяти

553

Запрашиваемое действие не выполнено, поскольку имя файла недопустимо

АССТ - Учетная запись. Указывает учетную запись, которая будет использоваться для сеанса FTP. Эта учетная запись отделена от имени пользователя, которое используется в процессе регистрации, однако она может управлять информацией об учете и доступе. Ниже приводится синтаксис команды АССТ:

АССТ учетная_запись #13#10

Коды откликов: 202, 230, 421, 500, 501, 503, 530 (табл. АЗ).

CDUP - Переход в родительский каталог. Эта команда является особым случаем команды CWD и используется для перехода вверх на один уровень в каталоге файловой системы на сервере FTP. Эта команда упрощает реализацию автоматизированных клиентских приложений FTP для работы с иными синтаксисами файловых систем. Синтаксис этой команды следующий:

CDUP#13#10

Коды откликов: 200, 421, 500, 501, 502, 530, 550 (табл. АЗ).

CWD - Изменить рабочий каталог. Изменяет текущий каталог на сервере FTP. Аргументом для этой команды является имя пути, указывающее каталог или другой системно-зависимый указатель файловой системы. Синтаксис команды изменений каталога следующий:

CWD путь #13#Ю

Коды откликов: 250, 421 500, 501, 502, 530, 550 (табл. АЗ).

PASS - Пароль. Передает соответствующий пароль серверу FTP для указанного имени пользователя. Если имя пользователя анонимно, паролем обычно является адрес электронной почты. Синтаксис команды следующий:

PASS пароль #13#10

Коды откликов: 202, 230, 332, 421, 500, 501, 503, 520 (табл. АЗ).

SMNT - Монтаж структуры. Монтирует другую структуру данных файловой системы на сервере. Аргументом является имя пути, указывающее каталог для монтажа. Синтаксис этой команды следующий:

SMNT путь #13#lO

Коды откликов: 202, 250,421, 500, 501, 502, 530, 550 (табл. АЗ).

USER - Имя пользователя. Инициализирует процесс регистрации сервера FTP. Вы отправляете эту команду с именем пользователя для регистрации. Если сервер допускает анонимные регистрации FTP, имя пользователя анонимно. Если анонимные регистрации не допускаются, необходимо использовать достоверное имя пользователя (регистрация учетной записи). Ниже приводится синтаксис команды:

USER имя_пользователя #13#10

Коды откликов: 230, 331,332, 421, 500, 501, 530 (табл. АЗ).

Команды выхода из системы

Следующие две команды завершают сеанс FTP. Каждая позволяет серверу продолжать любую передачу файлов, которая в данный момент осуществляется. Если соединение управления неожиданно закрывается, сервер прекращает выполняемую передачу файлов.

QUIT - Выход из системы. Прекращает регистрацию пользователя и приводит к тому, что сервер прекращает соединение команды. Выполняемая передача файлов продолжается до завершения. Синтаксис команды следующий:

QUIT #13#10

Коды откликов: 221, 500 (табл. АЗ).

REIN - Реинициализания. Завершает регистрацию пользователя, но сохраняет соединение команды открытым. Клиент может затем выдать другую команду USER для новой регистрации, используя другую учетную запись для выполнения дополнительных передач файлов. Любая передача файлов, которая осуществляется в тот момент, когда вводится эта команда, продолжается до завершения. Синтаксис команды имеет следующий вид:

REIN #13#10

Коды откликов: 120, 220, 421, 500, 502 (табл. АЗ).

Команды параметров передачи

Команды параметров передачи указывают параметры — типы данных, режимы передачи, порты соединений данных, адреса и т.д. Следует применять эти команды после того, как пользователь зарегистрируется на сервере и прежде, чем поступят запросы на передачу файлов. Можно повторно выдавать эти команды и изменять их для каждой передачи файла, которая должна осуществиться на протяжении сеанса.

MODE - Режим передачи. MODE является командой, которую вы будете применять очень редко (поскольку большинство реализаций FTP поддерживают только режим потока по умолчанию). MODE используется для переключения между режимами поток (S), блок (В) и уплотненной передачей. Синтаксис этой команды следующий:

MODE код_режима #13#10

Коды откликов: 200, 42!, 500, 501, 504, 530 (табл. АЗ).

PASV - Режим пассивного сервера. Предписывает серверу перейти в пассивный режим, в котором клиент может инициализировать соединение данных. Ответ (при условии, что он достоверен и что число 227 было возвращенным кодом ответа) содержит адрес Internet и порт TCP, который клиент будет использовать при выполнении этого соединения. Адрес сервера находится в том же формате, что и тот, который использует команда PORT. Синтаксис этой команды следующий:

PASV #13#10

Коды откликов: 227, 421, 500, 501, 502, 530 (табл. АЗ).

PORT - Адрес порта данных клиента. Сообщает серверу, какие адрес и порт TCP использовать для соединения данных. По умолчанию сервер подсоединяется к клиенту с помощью тех же адреса и порта, что и coeдинение команды клиента. Эта команда используется для сообщения серверу другого адреса или порта для передачи данных. Сервер пытается подсоединиться к указанным адресу и порту. Если клиент (а не сервер) должен инициализировать соединение данных, следует использовать команду PASV, а не команду PORT. Последняя осуществляет анализ 32-разрядного адреса Internet и 16-разрядного порта TCP с разбивкой на 8-разрядные значения и затем передает эти значения в виде чисел, разделенных запятыми. Синтаксис этой команды следующий:

PORT hl,h2,h3,h4,p1,p2 #13#10

Например, если клиент хочет, чтобы сервер подсоединился к порту 39 TCP и по адресу Internet 128.19.4.32, используется следующая команда:

PORT 128,19,4,32,0,39

где hl-h4 являются Internet-адресами клиента, а р1 и р2 — номерами порта для использования. Перед использованием этой команды гнездо клиента для соединения данных должно быть связано с этими адресом, и портом.

Коды откликов: 200, 421, 500, 501, 530 (табл. АЗ).

STRU - Структура файла. Маловероятно, что потребуется эта команда, указывающая структуру файла для использования при передаче (например, структура файла записи или страницы). Большинство передач файлов, которые необходимо выполнять, будут использовать структуру (файла) по умолчанию. Эта команда из тех времен, когда большинство систем обменивались файлами с самыми разными структурами. Такие структуры файлов уже не различаются столь существенно. Синтаксис этой команды следующий:

STRU код_структуры #13#10

Ниже приводятся коды используемых структур:

Код

Значение

F

Файл {внутренняя структура отсутствует)

R

Структура записи

Р

Структура страницы

Коды откликов: 200, 421, 500, 501, 504, 530 (табл. АЗ).

TYPE - Тип данных. Указывает тип данных для передачи файлов. Два типа данных, которые вы должны реализовать, — это A (ASCII) и I (Image). После А могут следовать спецификации форматирования, однако нет необходимости (и даже не рекомендуется), включать эти спецификации форматирования. Синтаксис этой команды следующий:

ТУРЕ тип кода #13#10

Коды откликов: 200, 421, 500, 501, 504, 530 (табл. АЗ).

Команды действия над файлами

Следующий набор команд FTP используется для выполнения различных операций с файлами (извлечения, отправления, перемещения (переименования) файлов), а также для того, чтобы дать возможность клиенту осуществлять некоторую организацию файловой системы на сервере. Большинство команд, которые связаны с передачей данных между системами клиента и сервера через соединение данных, возвращают два ответа. Первый ответ сообщает клиенту, что сервер собирается начинать передачу и открывать соединение данных (или что клиент должен сейчас открыть соединение данных), второй — что передача завершена или не получен результат и что соединение данных теперь должно быть закрыто.

ABOR - Прерывание передачи. Прерывает предыдущую команду и любую передачу файлов, которая, возможно, происходит в данный момент. Если предыдущая команда завершена, команда ABOR не дает эффекта. Если передача данных осуществляется, когда используется эта команда, она прерывает передачу и закрывает соединение данных. Соединение команды, однако, остается открытым.

Если передача файлов осуществляется при выдаче этой команды, она прекращает передачу данных и возвращает код отклика 426, указывая, что передача данных прекратилась аварийно. Затем сервер отправляет отклик 226 клиенту, указывая, что команда ABOR завершилась успешно. Синтаксис этой команды следующий:

ABOR #13#10

Коды откликов: 225, 226, 421, 500, 501, 502 (табл. АЗ).

ALLO - Распределить пространство памяти. Некоторые серверы FTP предписывают команде ALLO резервировать указанное пространство памяти для файла, который будет передаваться. Аргументом этой команды является целое число, обозначающее количество байтов для резервирования. Если сервер использует структуру записи или страницы, эта команда должна также передать количество записей или страниц для резервирования. Синтаксис этой команды следующий:

ALLO байты [ R число_эаписей ]#13#10

Коды откликов: 200, 202, 421, 500, 501, 504, 530 (табл. АЗ).

АРРЕ - Добавить к файлу (на сервере). Это третья форма команды STOR, она принимает имя файла с командой. Когда сервер получает файл через соединение данных, действие команды зависит от того, существует ли уже файл с этим именем. Если существует, команда добавляет к нему новый файл, а если нет, сервер создает новый файл. Синтаксис этой команды следующий:

АРРЕ имя_файла/путь #13#10

Коды откликов: 110, 125. 150, 226, 421,425, 426, 450, 451, 452, 500, 501, 502, 530, 532, 551, 552, 553 (табл. АЗ).

DELE - Удалить файл. Удаляет файл в файловой системе сервера FTP. Способность клиентов выполнять эту команду зависит от разрешений на доступ, имеющихся на сервере FTP, для учетной записи пользователя. Приложение клиента должно выполнить двойную проверку, прежде чем выдавать этот запрос команды серверу. Синтаксис этой команды следующий:

DELE имя_файла/путь #13#10

Коды откликов: 250, 421, 450, 500, 501, 502, 530, 550 (табл. А.З).

LIST - Список содержимого текущего каталога. Предписывает серверу отправить список содержимого текущего (или указанного) каталога клиенту через соединение данных. Эта передача данных должна использовать тип ASCII. Содержимое каталога форматируется в зависимости от системы сервера. Если сервером является система UNIX, список каталогов содержит флаги разрешения для каждого из файлов и каталогов, однако, если сервер является системой Windows NT, список выглядит, как список каталогов DOS. Синтаксис команды LIST:

LIST [путь] #13#10

Коды откликов: 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 502, 530 (табл. АЗ).

MKD - Создать каталог. Создает каталог в файловой системе сервера. MKD может принимать абсолютное или относительное имя пути в качестве аргумента. Способность создавать каталог ограничена правами доступа, которые распределяются при регистрации пользователя и которые клиент использует при выдаче команды. Синтаксис команды MKD следующий:

MKD путь #13#10

Коды откликов: 257, 421, 500, 501, 502, 530, 550 (табл. АЗ).

NLST - Список содержимого текущего каталога (только имена). Эта команда работает почти так же, как команда LIST, за исключением того, что переданные данные содержат только имена файлов. NLST не возвращает какой-либо другой информации. Синтаксис команды следующий:

NLST [путь] #13#10

Коды откликов: 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 502, 530 (табл. АЗ).

PWD - Рабочий (текущий) каталог. Извлекает имя текущего рабочего каталога на сервере FTP. Синтаксис команды следующий:

PWD#13#10

Некоторые клиенты FTP используют альтернативный синтаксис:

XPWD#13#10

Коды откликов: 257, 421, 500, 501, 502, 530 (табл. АЗ).

REST - Повторный запуск передачи файлов. Указывает маркер блока в файле, который должен использоваться в качестве отправной точки, когда будет инициализирована передача файла. REST не запускает передачу файлов, вам следует использовать команду RETR для запуска передачи. Команда REST приводит к тому, что сервер пропускает часть файла, предшествующую указанному маркеру блока после инициализации передачи. Можно использовать эту команду для повторного запуска передачи файлов, которая была прервана. Синтаксис команды REST следующий:

REST блок#13#10

Коды откликов: 350, 421, 500, 501, 502, 530 (табл. АЗ).

RETR - Извлечь файл. Предписывает серверу отправить конкретный файл клиенту. Синтаксис этой команды следующий:

RETR имя_файла/путь #13#10

Коды откликов: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, 550 (табл. АЗ).

RMD - Удалить каталог. Удаляет каталог из файловой системы сервера. RMD может принимать либо абсолютное, либо относительное имя пути в качестве аргумента. Способность удалять каталог ограничена правами доступа, которые распределены при регистрации и используются клиентом. Синтаксис этой команды следующий:

RMD путь #13#10

Коды откликов: 250, 421, 500, 501, 502, 530, 550 (табл. АЗ).

RNFR - Переименовать файл. Команда RNFR является первой половиной из двух команд, которые перемещают или переименовывают файл в файловой системе сервера. Эта первая команда для выдачи, указывающая текущий путь и имя файла, подлежащего перемещению, сразу же после него следует команда RNTO для указания новых пути и имени файла. Синтаксис команды RNFR следующий:

RNFR имя_файла/путь #13#10

Коды откликов: 350, 421, 450, 500, 501, 502, 530, 550 (табл. АЗ).

RNTO - Переименовать файл. Команда RNTO является второй из двух команд, которые перемещают или переименовывают файл в файловой системе сервера FTP. Этой команде непосредственно предшествует команда RNFR. Команда RNTO указывает новые имя и/или путь для файла, указанного в команде RNFR. Синтаксис команды RNTO следующий:

RNTO имя_файла/путь #13#10

Коды откликов: 250, 421, 500, 501, 502, 503, 530, 550, 553 (табл. АЗ).

STOR - Сохранить файл. Сообщает серверу, что клиент намерен отправить ему файл. Имя файла, переданное с командой, является именем, которое будет присвоено файлу в файловой системе сервера. Если уже существует файл с этим именем и пользователь имеет право на доступ, новый файл, который передается от клиента, удаляет и замещает файл на сервере. Синтаксис этой команды следующий:

STOR имя_файла/путь #13#10

Коды откликов: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 452, 500, 501, 530, 532, 551, 552, 553 (табл. АЗ).

STOU - Хранить с уникальным именем файла. Эта команда аналогична команде STOR, за исключением того, что сервер создает уникальное имя, которое присваивается файлу (этой командой имя файла не передается). Синтаксис этой команды следующий:

STOU #13#10

Коды откликов: 110, 125, !50, 226, 250, 421, 425, 426, 450, 451, 452, 500, 501, 530, 532, 551, 552, 553 (табл. АЗ).

Информационные и другие команды

Этот последний набор команд извлекает информацию о статусе сервера, операционной системе, опциях и командах, специфичных в плане реализации. Вам не часто придется использовать этот набор команд в приложении клиента FTP, он будет использоваться в интерактивном (приводимом в действие командной строкой) сеансе FTP.

HELP - Подсказка. Команда HELP возвращает информацию подсказки обо всех командах или о конкретной команде. Синтаксис команды HELP следующий:

HELP [ командная строка ]#13#10

Коды откликов: 211, 214, 421, 500, 501, 502 (табл. АЗ).

NOOP - Нет операции. Получает ответ ОК сервера. NOOP не влияет на какие-либо действия или команды, которые вводились ранее. Можно использовать NOOP как команду "поддерживать в активном состоянии", чтобы соединение команд оставалось активным. Синтаксис этой команды следующий:

NOOP#13#10

Коды откликов: 200, 421, 500 (табл. АЗ).

SITE - Параметры узла. Предоставляет службы для реализации сервера. Службы, которые используют эту команду, являются уникальными для каждой системы и необходимы для этой реализации, но не являются универсальными для всех систем. Для получения информации о том, какие службы подготовлены с помощью этой команды на конкретном сервере, используйте команду HELP в интерактивном сеансе FTP. Синтаксис команды SITE следующий:

SITE служба#13#10

Коды откликов: 200, 202, 500, 501, 530 (табл. АЗ).

STAT - Статус. Позволяет серверу отвечать состоянием передачи файла (если такая передача осуществляется в данный момент) или состоянием файла, указанного в качестве параметра команды. Синтаксис команды STAT следующий:

STAT [ имя_файла/путъ ]#13#10

Коды откликов: 211, 212, 213, 421, 450, 500, 501, 502, 530 (табл. АЗ).

SYST - Тип системы сервера. Устанавливает, какой тип операционной системы выполняет сервер. Ответ включает одно из имен систем, содержащееся в текущей версии документа RFC I700. Синтаксис команды SYST следующий:

SYST#13#10

Коды откликов: 215, 421, 500, 501, 502 (табл. АЗ).