Форум программистов, компьютерный форум, киберфорум
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 19.04.2010
Сообщений: 4
1

Знание протокола TCP под Linux, передача данных между клиентом и FTP сервером реализация на С++

19.04.2010, 17:29. Просмотров 3519. Ответов 7
Метки нет (Все метки)


Вопрос собственно такой. Есть программа, реализующая передачу данных с ftp сервера на клиент в активном режиме, написана на Си++. Насколько я понимаю активный режим, это когда все происходит по такой схеме. Клиент со своего порта посылает запрос серверу на его 21 порт, запрос на передачу данных. А сервер в свою очередь с 20-го порта пересылает данные клиенту. Собственно говоря вопрос в том, как сервер узнает на какой порт к клиенту он должен подключиться.

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

Кто может подробно объясните как это реализовано какими функциями и тд. желательно в программном коде. Заранее большое спасибо знающим людям!!!

http://narod.ru/disk/19886542000/ftp.cpp.html

вот как работает протокол tcp

21/tcp - это управляющий порт. По нему передаются только команды.
В активном режиме соединение выглядит так:
connect:................... client tcp/[N] --> server tcp/21 // N > 1023
send ftp command:.. PORT [N+1]
listen:....................... client tcp/[N+1]
connect:................... server tcp/20 --> client tcp/[N+1]

Я плохо разбираюсь в программировании и не вижу как и где это реализовано в моем коде, который я приложил, в этом и проблема.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2010, 17:29
Ответы с готовыми решениями:

Передача данных между клиентом и сервером
Какого мембера этот код не работает? Все же вроде верно написано! index.html: <!DOCTYPE...

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

Безопасная передача данных между клиентом и сервером
Здравствуйте. Я новичок в среде программирования WEB-ресурсов, поэтому не судите строго за глупые...

Директивы компиляций, передача данных между клиентом и сервером
Вот собственно код: &НаСервере function wa() var tz,tzs; tz=новый ТаблицаЗначений;...

7
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
19.04.2010, 18:24 2
Цитата Сообщение от komis Посмотреть сообщение
Собственно говоря вопрос в том, как сервер узнает на какой порт к клиенту он должен подключиться.
Например, клиентом послыается, команда типа "PORT 127,0,0,1,150,233\r\n", откуда:
150 = 0х96
233 = 0хЕ9
0x96E9 = 38633 - номер порта.
Потом с 20 порта сервер подключается к клиенту при необходимости.

Добавлено через 3 минуты
Цитата Сообщение от komis Посмотреть сообщение
в самом начале программы, а когда я смотрю логи передачи файлов, оказывается что реальный порт на который передавались данные отличается.
Я код не смотрел. Трейсы бы сделал, было бы понятнее, о чем речь.
0
0 / 0 / 0
Регистрация: 19.04.2010
Сообщений: 4
19.04.2010, 18:26  [ТС] 3
Цитата Сообщение от Vourhey Посмотреть сообщение
Например, клиентом послыается, команда типа "PORT 127,0,0,1,150,233\r\n", откуда:
150 = 0х96
233 = 0хЕ9
0x96E9 = 38633 - номер порта.
Потом с 20 порта сервер подключается к клиенту при необходимости.

Добавлено через 3 минуты

Я код не смотрел. Трейсы бы сделал, было бы понятнее, о чем речь.
код вот http://paste.org/pastebin/view/17534 - ссылка

а можно подробнее объяснить что вот это такое

sprintf(buf, "PORT %d,%d,%d,%d,%d,%d\r\n", (uchar_t)host->h_addr_list[0][0], (uchar_t)host->h_addr_list[0][1],
(uchar_t)host->h_addr_list[0][2], (uchar_t)host->h_addr_list[0][3],
(uchar_t)(cur_port>>8), (uchar_t)cur_port);


Я прочел весь этот мануал http://rsdn.ru/article/unix/sockets.xml который нашел, он показался мне довольно хорошим, но вот в этом месте не разобрался, не шарю в программировании к сожалению.

что вот это такое очень интересует -(uchar_t)(cur_port>>8), (uchar_t)cur_port);

еще по всей программе текущий порт увеличивается таким образом "cur_port++" не совсем понятно для чего это делается, какие-то тонкости работы протокола tcp?
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
19.04.2010, 18:31 4
komis, формирование риквеста PORT, о котором я писал выше. Можешь вывести свою строчку и посмотреть, какой запрос передается. Но, как я уже писал, все видно в трейсах.
0
0 / 0 / 0
Регистрация: 19.04.2010
Сообщений: 4
19.04.2010, 18:33  [ТС] 5
что такое трейсы?

то, что это формирование понятно, не совсем понятно как оно происходит
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
19.04.2010, 18:36 6
komis, конкретно эту строчку можешь вывести обычным сишным принтом. По поводу трейсов http://ru.wikipedia.org/wiki/Wireshark .
0
0 / 0 / 0
Регистрация: 19.04.2010
Сообщений: 4
19.04.2010, 19:29  [ТС] 7
отпишитесь в аську пожалуйста, как будет свободная минута 2Зодин993два89
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
19.04.2010, 20:07 8
То, что порт инкрементируется в коде, это нормально. каждый раз при запросе данных с сервера будет использоваться новое значение порта на стороне клиента. Если сделать поиск по cur_port все места, где меняется значение порта будут видны. По трейсам все было бы видно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2010, 20:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как с помощью протокола IP передавать сообщения между клиентом и сервером?
Всем привет.. подскажите, как с помощью протокола IP передавать сообщения между клиентом и сервером?

Как происходит передача данных между клиентом и сервером используя модель Entity Framework?
Entity Framework является некой оберткой над ado.net, но как происходит передача данных между...

TCP соединение между клиентом и сервером
Доброго времени суток ув. форумчане! Не могу соединить клиент и сервер через TCP в разных сетях....

Обмен данными между Сервером и Клиентом TCP
Ребят, помогите реализовать обмен данными между Сервером и Клиентом. На данный момент, у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.