Форум » [x]Harbour » Снова FTP » Ответить

Снова FTP

Dima: Проблема уже запарила. Одна и та же программа у 80 % юзеров работает нормально. У остальных проблема в связи по FTP. Связь организована с помощью HBTIP. На проблемных машинах по команде LIST или попытке скачать файл получаем ошибку FTP Error 425 "Can't open data connection" Чисто ради эксперимента такую проблемную машину подключили через мобильный инет. Связь с ФТП работает отлично. Звонили провайдеру , тот говорит что ни какие порты не закрывали. Куда копать не понимаю. Помнится раньше в Harbour была библиотека WHAT32 и в самых ранних своих версиях программы связь я реализовывал с ее помощью. А можно как то реанимировать функции из WHAT32 по работе с FTP ? PS Проверяли связь по ФТП через Total Commander , там проблем нет не с LIST ни со сливом файла.

Ответов - 18

SergKis: Dima У меня FTP на VO 2.7 много лет ok!, но у одного клиента никак. Сделал все на FTP.EXE и забыл.

Dima: SergKis пишет: Сделал все на FTP.EXE и забыл. А можешь маленький пример показать , подключение , получение LIST , отключение ? В общем я догадываюсь что работаешь через файл "сценария" опции -S , вот только не представляю как забрать в прогу ответ той же команды LIST , для дальнейшего анализа.

SergKis: Dima пишет:маленький пример вот bat файл (его читаю, меняю _____, ------- на имена файлов, ##### на IP) сохраняю с др.именем и запускаю: [pre2] @echo off for %%c in (%FTP%\%MES%\#_???_??.uch) do del %%c > nul rem PUT to FTP echo ===== Put,Dir ====== > ftp_win.txt ftp.exe -v -n -s:_____ -w:8192 ##### >> ftp_win.txt %PLL%\dbu.exe ^.\SCRIPT\umz_err.prg if exist ftp.err goto e rem DIR from FTP %PLL%\dbu.exe ^.\SCRIPT\umz_dir.prg rem GET from FTP echo ===== Get ========== >> ftp_win.txt ftp.exe -v -n -s:----- -w:8192 ##### >> ftp_win.txt %PLL%\dbu.exe ^.\SCRIPT\umz_err.prg if exist ftp.err goto e if exist ftp_dir.lst copy ftp_dir.lst %FTP%\%MES%\dir.lst > nul if exist ftp_dir.lst del ftp_dir.lst > nul if exist ftp.get del ftp.get > nul if exist ftp.lst del ftp.lst > nul for %%c in (%FTP%\%MES%\#_???_??.uch) do Call .\SCRIPT\uch_tst.bat %%c :e if exist ftp.blk del ftp.blk > nul [/pre2] dbu.exe утилита скрипта (это еще S87), пример скрипта UMZ_ERR.PRG: [pre2] m->Q0="FTP_WIN" aRead(m->Q0+".TXT","aFtp_Win",1) m->J2=len(m->aFtp_Win) fErase("FTP.ERR") FOR m->J1=1 TO m->J2 IF "Not conn" $ aFtp_Win[m->J1] tone(5000,1) mWrite("FTP.ERR","Not connected",1) m->J3=sv_wnd(24,0,24,79) Say(24,0,tm0("FTP not connected",80),79) inkey(0) rs_wnd(m->J3) QUIT 1 ENDIF NEXT QUIT [/pre2]


Dima: SergKis спасибо , сходу не осилил , многа букав. завтра внимательнее посмотрю. PS Порой сам такое напишу (закодю) что сразу не пойму , спустя пару месяцев ;)

SergKis: Dima пишет:многа букав сам с трудом вспомнил (начало 2000-х). в догонку скрипт (создает файл команд) для bat файла, котрый выше в посте: [pre2] m->J0="FTP_WIN.LST" m->S0="FTP_GET.LST" IF ! file(m->J0) m->J1=mGIniC([S_NET.INI],[FTP],"User") m->J2=mGIniC([S_NET.INI],[FTP],"Password") mWrite(m->J0,"user "+m->J1+" "+m->J2+chr(13)+chr(10),1) mWrite(m->S0,"user "+m->J1+" "+m->J2+chr(13)+chr(10),1) m->J1=mGIniC([S_NET.INI],[FTP],"CurDir") mWrite(m->J0,"mkdir "+m->J1+chr(13)+chr(10)) mWrite(m->J0,"cd "+m->J1+chr(13)+chr(10)) mWrite(m->S0,"cd "+m->J1+chr(13)+chr(10)) mWrite(m->J0,"mkdir "+m->Q2+chr(13)+chr(10)) mWrite(m->J0,"cd "+m->Q2+chr(13)+chr(10)) mWrite(m->S0,"cd "+m->Q2+chr(13)+chr(10)) mWrite(m->J0,"lcd "+m->Q1+chr(13)+chr(10)) mWrite(m->S0,"lcd "+m->Q1+chr(13)+chr(10)) mWrite(m->J0,"lcd "+m->Q2+chr(13)+chr(10)) mWrite(m->S0,"lcd "+m->Q2+chr(13)+chr(10)) mWrite(m->J0,"type binary"+chr(13)+chr(10)) mWrite(m->S0,"type binary"+chr(13)+chr(10)) ENDIF IF "PUT" $ m->Q5 m->J9=m->Q4+"_"+m->Q3+".UCH" mWrite(m->J0,"put "+m->J9+" "+"#_"+m->J9+chr(13)+chr(10)) mWrite(m->J0,"delete "+m->J9+chr(13)+chr(10)) mWrite(m->J0,"rename "+"#_"+m->J9+" "+m->J9+chr(13)+chr(10)) ENDIF IF "DIR" $ m->Q5 mWrite(m->J0,"lcd .. "+chr(13)+chr(10)) mWrite(m->J0,"lcd .. "+chr(13)+chr(10)) mWrite(m->J0,"dir "+chr(13)+chr(10)) mWrite(m->J0,"quit "+chr(13)+chr(10)) m->J0="FTP_WIN" m->J1=mRead(".\SCRIPT\"+m->J0+".BAT") m->J2=mGIniC([S_NET.INI],[FTP],"Server") m->J1=StrTran(m->J1,"_____",".\"+m->J0+".LST") m->J1=StrTran(m->J1,"-----",".\"+m->S0) m->J1=StrTran(m->J1,"#####",m->J2) mWrite(".\"+m->J0+".BAT",m->J1,1) ENDIF QUIT [/pre2]

Dima: SergKis сделал пару тестов , та же фигня .....425 ошибка на LS файл сценария (ip я перебил) open 111.11.11.11 21 user dima parolik type binary literal pasv ls *.zip quit запускаю так ftp -v -n -s:t.txt >my.log

SergKis: Dima пишет: та же фигня .....425 ошибка не знаю, что сказать - давно было, когда щупал ftp.exe. попробуй организовать подкаталог с переходом туда, сейчас стучишься на home сервера. я использовал dir, почему не ls - не помню. сори

SergKis: Dima стандартный клиент FTP в операционных системах Windows поддерживает далеко не полный перечень ftp-команд и, что самое важное - не поддерживает команду переключения в пассивный режим ( passv ) обмена с сервером FTP, что делает его непригодным для обмена данными с серверами FTP, подключение к которым выполняется с использованием технологии трансляции сетевых адресов NAT . Именно этот факт предопределяет область использования утилиты ftp.exe - только в локальных сетях. у клиента не шла на VO как раз локалка.

Dima: SergKis пишет: не поддерживает команду переключения в пассивный режим ( passv ) обмена с сервером FTP, это обходится вот такой командой literal pasv проверял log ftp , passive устанавливается

Dima: Разобрались. Дело в длине имени файла. Такой файл не тянется W_99^[sklad]#177D729F.zip , такой тянется W_99^[sklad]#77D729F.zip При чем это зависит от провайдера , проверили. После cимвола # в имени файла у меня идет уникальный код полученный из целого числа с помощью numtohex. Что то типа numtohex(1238773222,8) А есть ли какая функция что бы получить такой код длиной из 3 символов ? Вариант numtohex(1238773222,3) не предлагать ;)

petr707: Можно проще - применять небольшой файл-ярлык типа ini txt или xml с простым именем вместо шифрования имени скачиваемого файла. А в этом ini - и держать все нужные атрибуты - что и откуда скачивать

Dima: petr707 так не пойдет. 40 торговых точек и у каждой имя файла должно быть уникальным.

SergKis: Dima вот функции (может подойдет) : [pre2] FUNCTION NUM_KOD0( nKod ) // число в код IF valtype( nKod ) == "N"; RETURN baNUM_KOD3( nKod ) ENDIF RETURN "000" FUNCTION KOD_NUM0( cKod ) // код в число IF valtype( cKod ) == "C"; RETURN baKOD3_NUM( cKod ) ENDIF RETURN 0 FUNCTION KOD_ADD0( cKod ) // к коду + 1 (инкремент) IF valtype( cKod ) == "C"; RETURN baNUM_KOD3( baKOD3_NUM(cKod) + 1 ) ENDIF RETURN cKod STATIC FUNCTION baKOD3_NUM( cKod3 ) LOCAL dwKd3 := 0, dwKd, dwBase, ind := 48, Max_Kod := 239 dwBase := MAX_KOD - IND + 1 dwKd := Asc( SubS(cKod3, 1, 1) ) dwKd := iif( dwKd < IND .OR. dwKd > MAX_KOD, IND, dwKd) - IND dwKd3 := dwKd * dwBase * dwBase dwKd := Asc( SubS(cKod3, 2, 1) ) dwKd := iif( dwKd < IND .OR. dwKd > MAX_KOD, IND, dwKd) - IND dwKd3 += (dwKd * dwBase) dwKd := Asc( SubS(cKod3, 3, 1) ) dwKd := iif( dwKd < IND .OR. dwKd > MAX_KOD, IND, dwKd) - IND RETURN (dwKd3 + dwKd) STATIC FUNCTION baNUM_KOD3( nKod ) LOCAL dwBase, dwKd2, dwKd, dwMax, cKod, ind := 48, Max_Kod := 239 dwBase := MAX_KOD - IND + 1 dwKd2 := dwBase * dwBase dwMax := dwKd2 * dwBase - 1 IF nKod < 0 .OR. nKod > dwMax; RETURN "000" ENDIF dwKd := int(nKod / dwKd2) cKod := CHR( dwKd + IND ) nKod -= (dwKd * dwKd2) dwKd := int(nKod / dwBase) cKod += CHR( dwKd + IND ) nKod -= (dwKd * dwBase) dwKd := nKod RETURN (cKod + CHR( dwKd + IND )) [/pre2]

Dima: SergKis Спасибо , изучу.

petr707: А какие проблемы ? Каждая точка читает один ini-файл, находит в этом файле строку - по своему уникальному ID-коду (например,123) свое имя файла и качает его ===what.ini=== [filename] 123=fffff..123.....zip 124=bbbbbb.zip ... 777=dddd.zip

Dima: petr707 Да тоже вариант , спасибо !

Softlog86: Задача - открыть определенный файл (текстовый) на удалённом FTP-сервере и просто дописать в конец файла какую-то строку ... и закрыть файл . Это вообще реализуемо ? сейчас приходится скачивать файл к себе , модифицировать и отправлять назад ....

Петр: Softlog86 пишет: Это вообще реализуемо ? append local-file [remote-file] Append a local file to a file on the remote machine. If remote-file is left unspecified, the local file name is used in naming the remote file after being altered by any ntrans or nmap setting. File transfer uses the current settings for type, format, mode, and structure. A list of all vailable ftp commands



полная версия страницы