Что нового

[Сеть, интернет] не качает с FTP командами InetGet и _FTP_FileGet

sanek2000

Новичок
Сообщения
9
Репутация
1
Здравствуйте
Ни разу в жизни мне не удалось написать код и чтобы не было глобального затыка, который мне бы не пришлось решать через форумы, и вот я здесь. Первая же мини программа (не считая конечно же HellowWorld) не заработала, а всего то надо файл с ftp скачать, неужели у меня руки совсем не из того места растут!?
СУТЬ:
ОС: Win7 x32 - виртуальная машина VMware, сетевой адаптер в режиме Bridge
IE: 8.0.7601итд
AutoIt: 3.4.1
для начала воспользовался командами InetGet и InetGetSize и примерами из мануала
Код:
#include <InetConstants.au3>
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
InetGet('ftp://ftp.daper.net/pub/soft/moc/stable/moc-1.1.0.tar.gz','c:\moc-1.1.0.tar.gz',1,0)
Example()
Func Example()
    ; Retrieve the size of the file. The option of 'get the file from the local cache' has been selected.
    Local $iSize = InetGetSize("ftp://ftp.daper.net/pub/soft/moc/stable/moc-1.1.0.tar.gz",1)
    ConsoleWrite($iSize & @CRLF)
EndFunc   ;==>Example

результат ноль, ни файла, ни его размера. Хотя, если вставить URL до какой-нибудь картинки с любого сайта, все замечательно работает
Порылся у Вас на форуме, отыскал другой способ ( _FTP_FileGet), взял рабочий (не у меня :'( ) пример
Код:
#include <FTPEx.au3>

Local $sServer = 'ftp.daper.net'
Local $sUsername = ''
Local $sPass = ''

Local $hOpen = _FTP_Open('MyFTP Control')
Local $hConn = _FTP_Connect($hOpen, $sServer, $sUsername, $sPass)
Local $Ftpg = _FTP_FileGet($hConn, "/pub/soft/moc/stable/moc-1.1.0.tar.gz", "c:\moc-1.1.0.tar.gz")
Local $iSize = _FTP_FileGetSize($hConn,"/pub/soft/moc/stable/moc-1.1.0.tar.gz")
ConsoleWrite($iSize & @CRLF)

Local $iFtpc = _FTP_Close($hConn)
Local $iFtpo = _FTP_Close($hOpen)

НО, результат тот же - по нулям.
Нашел пример кода с дебаггером
Код:
#include <FTPEx.au3>
#include <Debug.au3>

_DebugSetup(StringTrimRight(@scriptname, 4) & ' example', True)

Local $server = 'ftp.daper.net'
Local $username = ''
Local $pass = ''

Local $Open = _FTP_Open('MyFTP Control')
Local $Callback = _FTP_SetStatusCallback($Open, 'FTPStatusCallbackHandler')

Local $Conn = _FTP_Connect($Open, $server, $username, $pass, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0, $Callback)

Local $Ftpc = _FTP_Close($Open)

Func FTPStatusCallbackHandler($hInternet, $dwContent, $dwInternetStatus, $lpvStatusInformation, $dwStatusInformationLength)
    #forceref $hInternet, $dwContent
    If $dwInternetStatus = $INTERNET_STATUS_REQUEST_SENT Or $dwInternetStatus = $INTERNET_STATUS_RESPONSE_RECEIVED Then
        Local $Size, $iBytesRead
        $Size = DllStructCreate('dword')
        _WinAPI_ReadProcessMemory(_WinAPI_GetCurrentProcess(), $lpvStatusInformation, DllStructGetPtr($Size), $dwStatusInformationLength, $iBytesRead)
        _DebugOut(_FTP_DecodeInternetStatus($dwInternetStatus) & ' | Size = ' & DllStructGetData($Size, 1) & ' Bytes    Bytes read = ' & $iBytesRead)
    Else
        _DebugOut(_FTP_DecodeInternetStatus($dwInternetStatus))
    EndIf
EndFunc

Вот что он показал
Код:
AutoIt: 3.3.12.0, AdminMode, OS: WIN_7/SP1/X86, OSLang: 0419, Keyboard: 00000409, CPUArch: X64, Script: C:\Users\localadmin\Desktop\ftp.au3

Handle created
Resolving name ...
Name resolved
Connecting to server ...
Connected to server
Receiving response ...
Response received | Size = 65 Bytes    Bytes read = 4
Sending request ...
Request sent | Size = 16 Bytes    Bytes read = 4
Receiving response ...
Response received | Size = 75 Bytes    Bytes read = 4
Sending request ...
Request sent | Size = 12 Bytes    Bytes read = 4
Receiving response ...
Response received | Size = 50 Bytes    Bytes read = 4
Closing connection ...
Connection closed
Handle closing ...
>>>>>> Please close the "Report Log Window" to exit <<<<<<<
я так понимаю, все в порядке, так почему же мне даже размер файла не посмотреть?

Вот скажите мне люди, неужели я настолько криворук, ну как так может быть!? я конечно понимаю, что не внимательность мой конек, но это уже слишком!

PS: в реале сервер с авторизацией, но, как видите, с открытых серверов тоже не качает, хотя, если вставить прямую ссылку на файл в браузер, он замечательно все качает. Скомпилированный exe-шник на другой машине тоже не срабатывает.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Касперский не стоит? У меня были проблемы с FTP из за касперского.
 
Автор
S

sanek2000

Новичок
Сообщения
9
Репутация
1
ну ёшкин кот, долбаный касперыч. конечно, он у меня на реальной машине и стоит. причем не работает, даже если его полностью вырубить, собака такая.

Спасибо, друг!


Добавлено:
Сообщение автоматически объединено:

РафикКаспер ниучём ниуинават!

попробовал полностью отключить каспера, даже в настройках сетевухи его рубанул резулбтат 0
ладно, раздал инет через телефон и вуаля, процесс пошел, включил каспера обратно, все работает
значит, думаю, это провайдер шалит, либо рутер. подрубаю обычный инет обратно, подключаю vpn одной из моих фирм, пробуем - закачка тютю, нет ее, другой vpn - то же самое

Вывод: не берите дешевые китайские роутеры, типа Buffalo, даже если вам их дарят :smile:

PS: не пойму правда, почему не работает скрипт в autoit, из-под браузера и проводника ftp пашет на ура
 
Автор
S

sanek2000

Новичок
Сообщения
9
Репутация
1
Нифига тема не решена :mad:

Дописал программу, и раскидал по своим серверам (их порядка 40), и на половине из них закачка по ftp не работает, хотя если через проводник к ftp цепляться, все зашибись. Никак не могу найти взаимосвязь, все сервера с одной и той же ОС, брандмауер везде настроен одинаково, некоторые серваки даже на одном шлюзе сидят, но результат разный.
И еще прооблемка добавилась, на паре серверов не докачивается буквально 200 килобайт и программа идет дальше, слип на 5 сек не помогает.
Вот так :'(

Из какого .au3 берется функция InetGet? Может глядя на сорцы до меня хоть что-нибудь дойдет?
 
Автор
S

sanek2000

Новичок
Сообщения
9
Репутация
1
жаль, хотелось разобраться поглубже
но я покопался в FTPEx.au3 и сделал вот так:
Код:
#include <FTPEx.au3>

Local 	$sServer = 'ftp.server.ru'
Local 	$sUsername = 'user'
Local 	$sPass = '****'
Local	$ftp_file='file.exe'

Local $hOpen = _FTP_Open('MyFTP Control')
Local $hConn = _FTP_Connect($hOpen, $sServer, $sUsername, $sPass, 1) ; вот эта еденичка включает пассивный режим
Local $Ftpg = _FTP_FileGet($hConn, '/'&$ftp_file, @WorkingDir&'\'&$ftp_file)
Local $iSize = _FTP_FileGetSize($hConn,'/'&$ftp_file)
ConsoleWrite($iSize & @CRLF)

Local $iFtpc = _FTP_Close($hConn)
Local $iFtpo = _FTP_Close($hOpen)

Странно, что работает только в пассивном режиме, хотя в TotalCommander работает и не в пассивном
Еще странно то, что InetGet вроде как в пассивном по-умолчанию, это же функция использует встроенную виндовую dll-ку (или нет?), ту же, что IE юзает => должно работать в пассивном режиме, но нет.
 
Верх