Сейчас на форуме: hgdagon (+5 невидимых)

 eXeL@B —› Программирование —› FTP протокол (рекурсивная загрузка файлов на сервер)
Посл.ответ Сообщение

Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 13 августа 2007 11:13
· Личное сообщение · #1

Пишу мини-фтп клиент(возможностей по минимуму в связи с тем что нормальных клиентов туевы хучи, а тут дело особое - поэтому и пишу). Не могу понять смысл рекурсивной загрузки файлов на сервак: дома я поставил FileZilla server и на нём тестил - всё отлично загружалось на мой сервер(тоесть вся иерархия директорий сохранялась, и их содержимое соответственно) айпишник которого я указывал как 127.0.0.1. При тесте своей тульзы в локалке произошли ошибки (( Моя утиль нормально коннектилась к серверу(там тоже стояла FileZilla) но вот при загрузке файлов на сервер я аж прозрел - директории создавались нормально, а вот файлы туда не заливались, что делать - хз. Реализовую свою утиль на WinAPI(wininet). Ещё я испытал неудобство с апи: FtpSetCurrentDirectory и FtpGetCurrentDirectory. При их вызове я получаю ошибку(false), хотя директория меняется(выходит что true:s14, тоесть я когда заливаю файлы, то они правильно заливаются на сервер(в установленную мною директорию при помощи FtpSetCurrentDirectory, как на 127.0.0.1 так и на удалённый фтп сервер, только там опять же создаются только дирекотрии).
И ещё я испытал затрудения с загрузкой файлов на сервер - когда рекурсивно происходит загрузочка, то может случится так, что файл не будет выбран(один или два, не больше) и не зальётся соответственно. Я впаял тогда перед заливкой вызов паузы(Sleep(5)) и проблема вроде как ушла, не могу понять с чем это связано - может мой фтп сервак не успевал обрабатывать файлы?

В аттаче сорсы(проэкт на Dev-cpp, но можно с лёгкостью его перебить на Visual Studio)

0e92_13.08.2007_CRACKLAB.rU.tgz - parser.rar

-----
все багрепорты - в личные сообщения




Ранг: 5.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 августа 2007 19:01
· Личное сообщение · #2

у меня вообще почему то такой код:
FtpPutFile(hConnect, buffer, fdata.cFileName, FTP_TRANSFER_TYPE_BINARY, NULL);
возвращает ошибку
ERROR_SXS_ASSEMBLY_NOT_FOUND (00002EE3)
несмотря, однако, на то что сервер все же получает комманды:
[2007-08-13 - 19:00:56] - [76] KEYWORD: TYPE -- PARAMS: I
[2007-08-13 - 19:00:56] - [76] KEYWORD: PASV -- PARAMS:
[2007-08-13 - 19:00:56] - [76] KEYWORD: STOR -- PARAMS: D:\projects\1111111\release\suko\socks.log

непонимаю ничерта



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 14 августа 2007 11:35
· Личное сообщение · #3

Блин ерунда какая-то, вот этот кодес не пашет :

#include <windows.h>
#include <wininet.h>

HINTERNET ses;
HINTERNET hconnect;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
ses=InternetOpen("ftpX v.0.0.0.1",INTERNET_OPEN_TYPE_PRECONFIG,0,0,INTERNET_FLAG_ASYNC);
if(!ses)
{
MessageBox(0,"Some error on InternetOpen [step 1]","ERROR",MB_ICONERROR);
}
else
{
hconnect=InternetConnect(ses,"192.168.61.164",INTERNET_DEFAULT_FTP_P ORT,"tobo-robot","toborobot",INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIV E,0);
if(!hconnect)
{
MessageBox(0,"Some error on InternetConnect [step 2]","ERROR",MB_ICONERROR);
}
else
{
if(!FtpPutFile(hconnect,"E:\d2k2_crackmes\_d2k2_crkme01\d2k2_crackme01 .exe","d2k2_crackme01.exe",FTP_TRANSFER_TYPE_BINARY,0))
{
MessageBox(0,"Some error on FtpPutFile [step 3]","ERROR",MB_ICONERROR);
return 0;
}
}
}
return 1;
}

-----
все багрепорты - в личные сообщения





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 14 августа 2007 19:13
· Личное сообщение · #4

HandMill пишет:
if(!FtpPutFile(hconnect,"E:\d2k2_crackmes\_d2k2_crkme01\d2k2_crackme01 .exe","d2k2_crackme01.exe",FTP_TRANSFER_TYPE_BINARY,0))

Поправь back slashes

Ну а по поводу главного вопроса, под cygwin-ом есть ncftp, ncftpget, ncftpput.

Ну а по поводу отладки - воткни printf/cout во все операции с путями и именами - где-то косяк, и ты его увидишь в логе.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 14 августа 2007 19:22
· Личное сообщение · #5

HandMill, и вот ещё косяк - убери INTERNET_FLAG_ASYNC флаг.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 15 августа 2007 12:52
· Личное сообщение · #6

С back slash'ами у меня в сорсе всё в порядке (см. аттач).
s0larian пишет:
и вот ещё косяк - убери INTERNET_FLAG_ASYNC флаг

убирал - не помогло(менял на 0). Также ещё пробовал менять на INTERNET_FLAG_FROM_CACHE и INTERNET_FLAG_OFFLINE

22c6_15.08.2007_CRACKLAB.rU.tgz - parser.rar

-----
все багрепорты - в личные сообщения





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 августа 2007 19:54 · Поправил: s0larian
· Личное сообщение · #7

HandMill, только что добавил обработчики ошибок, всё работет нормально. Лови файлик. Компилеццо из командной строки так: "cl main.cpp /EHsc Wininet.lib user32.lib"

Код нормальный, след. твоя беда с настройкой сервера - либо account кривой либо права к каталогам.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 августа 2007 19:56
· Личное сообщение · #8

атач слетел после редактирования...

f6cb_15.08.2007_CRACKLAB.rU.tgz - main.cpp




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 августа 2007 20:03 · Поправил: s0larian
· Личное сообщение · #9

HandMill пишет:
"под cygwin-ом есть ncftp, ncftpget, ncftpput" а можно тут попдробнее - с примером там каким-нить... а то в MSDN нет ничего про ncftp, ncftpget и ncftpput ((

если не хочешь писать код, то качни инстолер cygwin-a: http://www.cygwin.com/setup.exe http://www.cygwin.com/setup.exe
В списке будет прога "ncftp" у которой милион параметров. C ней в комплекте идут ещё две проги для put и get:

ncftpput [flags] remote-host remote-dir local-files... (mode 1)

Flags:
-u XX Use username XX instead of anonymous.
-p XX Use password XX with the username.
.....
-R Recursive mode; copy whole directory trees.




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 16 августа 2007 12:11
· Личное сообщение · #10

Неа, чё-то твой код тоже не работает. Ты его как и я тестил на локальном ФТП-сервере.
s0larian пишет:
твоя беда с настройкой сервера - либо account кривой либо права к каталогам

Аккаунт - точно не кривой, иначе бы я имел ошибку "Some error on InternetConnect [step 2]". И с правами к каталогам всё нормально, ведь я могу же через любой фтп-клиент коннектиться к указанному серверу, создавать там каталоги и заливать туда файлы. И файл "E:\d2k2_crackmes\_d2k2_crkme01\d2k2_crackme01.exe","d2k2_crackme01.ex e" у меня на жёстком диске тоже существует.
HandMill пишет:
дома я поставил FileZilla server и на нём тестил - всё отлично загружалось на мой сервер

я тоже умею к localhost коннектицца и лить туда нормально(!) файлы - у меня программа то дома работала отлично.
Спасибо за INTERNET_FLAG_ASYNC - заменяю его теперь на 0 и уже функция FtpSetCurrentDirectory возвращает true. Осталось разобраться с FtpPutFile.

-----
все багрепорты - в личные сообщения





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 16 августа 2007 19:14 · Поправил: s0larian
· Личное сообщение · #11

HandMill, я вижу только два правдоподобных варианта:

а) на сервере что-то криво с путями/каталогами/правами. Например default dir не стоит, или тебе надо зайти в под-каталог. (я заливал файлик как incoming/main.c)

б) локальный путь кривой - попробуй без пути, например. То есть из запусти прогу и заливай из текущего каталога.

Ну, что ещё... код рабочий, думаю что-то у тебя с правами/путями. О, кста, проверь что ты не unicode компилишь, а то все строковые константы надо оборачивать в _T("this is an ANSI string"). Ну и скомпиль напрямую используя CL. (компилер можешь слить с microsoft.com)



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 18 августа 2007 13:45
· Личное сообщение · #12

s0larian Большое спасибо! Вроде всё получилось .... нужно будет мне ещё это дело потестить.
В аттаче работающий проект для загрузки файла на сервер по фтп на Dev-Cpp.

f3be_18.08.2007_CRACKLAB.rU.tgz - FTPupload.rar

-----
все багрепорты - в личные сообщения





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 20 августа 2007 19:54
· Личное сообщение · #13

HandMill, так где косяк был?



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 20 августа 2007 22:52
· Личное сообщение · #14

s0larian косяк был во флагах. Я наконец-то с помощью твоего кода научился заливать файлы к себе на handmill.jino-net.ru по ftp://FTP. Но, на работе у меня так и не получилось залить файлы на сервер, где косяк - хз . Сервер настроен вроде как нормально ... стоит прокся (но сервер то в локалке). Этот код нормально коннектится к серверу (используя логин и пароль). может создавать там директории, а вот файл залить - фиг там! Хотя можно делать ВСЁ используя FileZilla (с тем же логином и паролем).

-----
все багрепорты - в личные сообщения





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 21 августа 2007 01:38
· Личное сообщение · #15

HandMill, проверь тогда какой режим использутся в рабочем и глючно случае (active/passive). Может у тебя на компе windows firewall не пускает incoming connection в active mode.

и ещё вызави InternetGetLastResponseInfo() - посмотришь в чём поблема.


 eXeL@B —› Программирование —› FTP протокол (рекурсивная загрузка файлов на сервер)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати