Хелпикс

Главная

Контакты

Случайная статья





Соединение данных



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

Обычно соединение данных открывается следующим образом:

    -клиент создает сокет данных S1 и выбирает свободный порт на своем хосте;

    -клиент привязывает сокет данных к своему IP адресу и свободному (не задействованому)порту функцией bind.

    -клиент включает порт на прослушивание запросов от сервера функцией listen;

    -клиент создает командный сокет S2

    -клиент связывается с сервером функцией connect, используя при ее вызове командный сокет S2 и заполненную структуру sockaddr_in с IP адресом сервера и портом 21

    - клиент передает серверу по управляющему соединению команды(USER, PASS) и сообщает серверу командой PORT свой IP-адрес и номер порта, на который сделал  открытие. допустим IP-адрес хоста клиента будет 10. 21. 23. 10, а номер порта 2000). Клиент посылает серверу по управляющему соединению команду PORT 10, 21, 23, 10, 7, 208. Номер порта строится  так – 7*256+208 = 2000. Сервер после получения этой команды попытается сделать активное открытие указанного порта и в случае удачи вернет что-то вроде «200 PORT command successful. Consider using PASV. »;

    - сервер, получив порт и IP-адрес осуществляет его активное открытие;

    - клиент системным вызовом accept извлекает из очереди, организованной системным вызовом listen, первый запрос на соединение и возвращает дескриптор нового (автоматически созданного) сокет S3 с теми же свойствами, что и созданный сокет данныхS1.

    - После этого передаются или принимаются данные функциями recv, send, которые при их вызове в качестве аргумента используют сокет S3;

    - в зависимости от того кто передает, а кто принимает данные осуществляется закрытие порта.

 

    Перед тем, как осуществлять прием или передачу данных серверу необходимо указать какой тип данных будет передаваться, делается это командой TYPE N, где N = «A», если тип ASCII и N = «I», если файл бинарный. Клиент посылает серверу команду TYPE I, на что получает ответ – «200 Switching to Binary mode. ».

        Все, соединение данных установлено остается дать команду передачи данных серверу, что и делает клиент - RETR HIDE. EXE(для примера файл «HIDE. EXE», расположен в корневом каталоге сервера). В ответ на эту команду  в случае если все нормально (файл существует и может быть передан) сервер отвечает «150 Opening BINARY mode data connection for HIDE. EXE (4096 bytes). » и начинает передавать файл по соединению данных. Когда файл будет полностью отправлен сервер пошлет сообщение «226 File send OK. » и произведет закрытие соединения данных.

Клиент ждет окончания получения данных после чего закрывает порт соединения данных со своей стороны.

Итак файл получен клиентом, остается разорвать управляющее соединение, клиент посылает команду QUIT, сервер отвечает «221 Goodbye. » и разрывает соединение.

    Пример работы с FTP-протокола. Обозначения: S - сервер, U - пользователь.

S: 220 Service ready for new user
U: USER Gluk
> S: 331 User name okay, need password
U: PASS murmur
S: 230 User logged in, proceed
U: RETR test. txt
S: 150 File status okay; about to open data connection

< Идет передача файла... >

S: 226 Closing data connection, file transfer successful
U: TYPE I
S: 200 Command okay
U: STOR /home/images/first. my
S: 550 Access denied
U: QUIT

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.