Может кто подскажет, как решить проблему: есть программа (на клиентской стороне), которой нужно связаться с сервером, чтобы работать по ftp. Но сервер меня не понимает! Постоянно переспрашивает пароль, потом логин и пароль, опять пароль, и так далее - можно до Судного дня развлекаться :-). Сервер использует пассивный сокет по соображениям безопасности, и мой Winsock поэтому буксует. Как перевести Winsock из PASS в PORT?! Ведь должен быть простой выход!
скорее всего для пассивного режима существует команда FTP'шная... если даже и не так, то можно подсмотреть снифером пакеты (в частности команды) что обмениваются меж собой сервер и, к примеру, Total Comander, который, на сколько мне известно, пассивный режим поддерживает.
ЗЫ
Заранее прошу прощения если не в тему, т.к. что такое пассивный сокет представляю с трудом... я про пассивный режим доступа к FTP'шнику...
Есть пассивные сокеты, то есть они находятся на прослушке, а не выясняют самостоятельно, кто к ним подключился. Это уже становится заботой самого клиента .
В том-то и проблема, что пароль и имя пользователя запрашиваются сразу после подключения и "объяснить" серверу ничего не успеваешь. Эта функция должна быть в самом Winsock, вот только я ее не смог найти...
Допустим,CuteFTP одинаково лихо управляется и с PASV, и с PORT (а написан он на VB), и я сомневаюсь, что сделали его без Winsock . В скрипте автоматизации стоит команда (Object).DataChannel = "PORT", и все работает.
Есть пассивные сокеты, то есть они находятся на прослушке, а не выясняют самостоятельно, кто к ним подключился. Это уже становится заботой самого клиента .
В том-то и проблема, что пароль и имя пользователя запрашиваются сразу после подключения и "объяснить" серверу ничего не успеваешь. Эта функция должна быть в самом Winsock, вот только я ее не смог найти...
Допустим,CuteFTP одинаково лихо управляется и с PASV, и с PORT (а написан он на VB), и я сомневаюсь, что сделали его без Winsock . В скрипте автоматизации стоит команда (Object).DataChannel = "PORT", и все работает.
Слушающий сокет не называется пассивным.
Это первое.
В винсоке нет ни одной команды FTP.
Это второе.
Не путай уровни транспорта.
Их всего семь.
Тебе нужен уровень протокола, а ты пытаешься работать с ним свойствами сокета.
Сокет вообще не трогай. Если он законнектился, это всё, что от него требуется. Потом только SendData.
GSerg, спасибо за ваши ответы. Я, разумеется, не эксперт (до вас мне далеко), поэтому в полемику ввязываться не буду. Если честно, я просто ищу решения своей проблемы. Простите, что своими речами перешел "красную черту", и оскорбил ваши чувства. Честное слово, мне очень жаль.
Наверное, вы правы, вы более компетентны, нежели я. Если вас не затруднит, напишите (или же ткните носом), как мне реально выйти из этого затруднительного положения? Говорите, что это - транспорт. И слава Богу! Но что мне делать-то? Нужен уровень протокола? Я бы с радостью, но не знаю, что мне предприять.
Winsock коннектится, тут проблем нет, но после того, как я что-то ввел через SendData (возможно, что неправильно), сервер требует логин и пароль. Вот так и начинается эта карусель . Как я понимаю, после ответа сервера, что подключение состоялось, я могу изменить уровень протокола. Какая команда нужна? И вообще, где мне взять список этих комманд? В виндошных хелпах - кот наплакал (если не выражаться уж совсем откровенно), а для меня она ценна и необходима.
Я, разумеется, не эксперт (до вас мне далеко), поэтому в полемику ввязываться не буду. Если честно, я просто ищу решения своей проблемы. Простите, что своими речами перешел "красную черту", и оскорбил ваши чувства. Честное слово, мне очень жаль.
Наверное, вы правы, вы более компетентны, нежели я.
Вот ужас-то...
Если я не кажусь белым и пушистым, это не следует трактовать как моё стремление позиционировать себя выше кого-то.
Я просто не белый и пушистый, не более того.
Нужен уровень протокола? Я бы с радостью, но не знаю, что мне предприять.
Это значит, что нужно слать правильные команды FTP, а не менять свойства сокета.
Люди всякие встречаются . Сам не белый и пушистый, поэтому и стараюсь быть вежливым... чтобы не хамить кому-нибудь.
Интересного много, согласен. Но меня интересует следующее:
PORT <SP> <host-port> <CRLF>
host-port - что это? Насколько я понял, сервер уже меня принял с распростертыми объятиями, скажем, на 21-ом порту. И какой еще порт надо указывать? Опять 21-ый, 990-ый, или еще какой? А может IP-шник через Resolve добывать и пихать туда? Это тупик. Возможно, я тут вообще идиотские вопросы задаю, но вы уж не откажите человеку в участии . Вообще, как система авторизации проходит, в том числе при наличии SSL (как понимаю, проблемы из-за этого). Мне не хватает понимания самой системы, отсюда эти беспорядочные вопросы и небезупречные суждения. Помогите, plise!
может просто стоит почитать мануал по FTP протоколу? http://web-island.narod.ru/doc/ftp.rar
Не все так просто, HACKER, там простенький мануальчик, и нужной коммандой PORT даже не пахнет. В заключение, дается совет, что другие комманды можно посмотреть в хелпе FTP-клиента. А ftp.exe не имеет интересующей комманды, либо держит ее в большущем секрете (даже от своих разработчиков, как понимаю). Так что этот вариант не канает.
sne я тоже благодарен, но нужной инфы для данного случая по предложенному адресу я не нарыл.
Как-то вообще странно получается - все либо слишком сложно, либо слишком просто (и неполно), а золотой середины не наблюдается. Может карма, так ее разэтак, взялась за меня по полной программе? Ладно, вопрос риторический, и не по теме вовсе...
Теперь вопрос к Sharp. Спасибо за ответ вкратце, но он мне ничего пока не объяснил. Может вы встречались с подобным траблом? Тут вопрос вообще странный: мне говорят, что PORT - стандартная комманда FTP. Согласен, наверное это так. Но нигде не встретил описания примера - как вообще эту штуку замутить? Спецификация, которую мне посоветовал читать GSerg - вещь, вообщем-то, чудесная, но это справочник, а не мануал в точном смысле этого слова. Он интересен, не спорю, но если ты уже что-то сделал и теперь разбираешься в тонкостях (то есть думаешь как сделать то, что ты уже сделал, лучшим в работе). Но я вообще ничего не имею на руках! И мне эти тонкости ничего существенного сказать не могут.
Простите, ребята, я наверое уже достал вас своими расспросами. Но я по прежнему ищу ответ, кто может - помогите.
IP и порт - 6 байт (4 байта IP, 2 байта порт)... Вот, берешь, открываешь у себя порт для передачи данных, а серверу передаешь свой IP и номер открытого порта. Все эти 6 байт передаются в 10-чном виде, разделенные запятой. Ну и получается код вроде такого (на .NET):
Listener = New TcpListener(Dns.GetHostByName(Dns.GetHostName()).AddressList(0), 0)
Listener.Start()
'Тут номер порта, например 8765
Dim dataport As Int32 = CType(Listener.LocalEndpoint, IPEndPoint).Port
'Тут IP, например "62.118.252.240"
Dim datahost As String = CType(Listener.LocalEndpoint, IPEndPoint).Address.ToString()
'Разбиваем порт на два байта
Dim fport As Int32 = dataport \ 256
Dim sport As Int32 = dataport Mod 256
'В datahost меняем точки на запятые, т.к. FTP-серверу нужны именно запятые
datahost = datahost.Replace(".", ","
'Отправляем команду PORT серверу
Send("PORT " & datahost & "," & fport.ToString & "," & sport.ToString)