Ftp, problem z pobieraniem [Delphi]

0

Witam,
wprowadzono zmiany na ftp.bossa.pl
Teraz trzeba się logować [anonymous/anonymous].
Okazuje się, że część programów sobie z tym nie radzi np. firefox, mój program również ma problemy z zalogowaniem. Google chrome, total commander nie mają żadnych problemów.
Bardzo proszę o pomoc co robię źle - poniżej kod.
Problem występuje na etapie funkcji InternetConnect.
Niestety nie umiem obsłużyć w delphi InternetGetLastResponseInfo aby dowiedzieć się co jest nie tak :/.
Proszę o jakieś wskazówki. Z góry uprzejmie dziękuję.

 

procedure TForm1.PobierzPlikFTP(ftpDir, ftpFile, TargetFile: string);
const
  READ_BUFFERSIZE                 = 4096;
  strHost                         = 'ftp.bossa.pl';
  port                            = 21;
  strUser                         = 'anonymous';
  strPwd                          = 'anonymous';

var
  hNet, hFTP, hFile               : HINTERNET;
  buffer                          : array [0..READ_BUFFERSIZE - 1] of Char;
  bufsize, dwBytesRead, fileSize  : DWORD;
  sRec                            : TWin32FindData;
  LocalFile                       : file;
  bSuccess                        : Boolean;


begin
  dwBytesRead:= 0;

  { Open an internet session }
  hNet := InternetOpen('Moj program', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  { See if connection handle is valid }
  if hNet = nil then
  begin
    ShowMessage('Brak dostępu do: WinInet.Dll');
    Exit;
  end;
  { Connect to the FTP Server }
  hFTP := InternetConnect(hNet, PWideChar(strHost), port, PWideChar(StrUser), PWideChar(strPwd), INTERNET_SERVICE_FTP, 0, 0);
  if hFTP = nil then
  begin
    InternetCloseHandle(hNet);
    ShowMessage(Format('Host: "%s" jest niedostępny',[strHost]));
    Exit;
  end;

  { Change directory }
  bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));

  if not bSuccess then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Brak folderu: %s.',[ftpDir]));
    Exit;
  end;

  { Read size of file }
  if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
  begin
    //ponizej zly sposob pobierania wielkosci pliku !!!
    //fileSize := sRec.nFileSizeLow;
    //Label2.Caption:= DateTimeToStr(FileTimeToDateTime(sRec.ftlastWriteTime));
  end else
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Brak pliku: %s',[ftpFile]));
    Exit;
  end;

  { Open the file }
  hFile := FtpOpenFile(hFTP, PChar(ftpFile), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0);

  if hFile = nil then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  fileSize:= FtpGetFileSize(hFile, @dwBytesRead);

  { Create a new local file }
  AssignFile(LocalFile, TargetFile);
  {$i-}
  Rewrite(LocalFile, 1);
  {$i+}

  if IOResult <> 0 then
  begin
    ShowMessage(Format('Nie można utworzyc pliku: %s.',[TargetFile]));
    InternetCloseHandle(hFile);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  //dwBytesRead := 0;
  bufsize := READ_BUFFERSIZE;

  while (bufsize > 0) do
  begin
    Application.ProcessMessages;
    if not InternetReadFile(hFile, @buffer, READ_BUFFERSIZE, bufsize) then Break;
    if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then BlockWrite(LocalFile, buffer, bufsize);
    dwBytesRead := dwBytesRead + bufsize;

  end;

  CloseFile(LocalFile);
  InternetCloseHandle(hFile);
  InternetCloseHandle(hFTP);
  InternetCloseHandle(hNet);

end;

0

Dzięki misiekd - troszkę pomogło, jestem jeden krok do przodu:
zrobiłem:

    LpdwBufferLength:= 1024;
    GetMem(lpszBuffer, LpdwBufferLength);
    InternetGetLastResponseInfo(lpdwError, lpszBuffer, lpdwBufferLength);
    ShowMessage(lpszBuffer);
    FreeMem(lpszBuffer);
 

Funkcja InternetGetLastResponseInfo zwróciła mi:

220 ProFTPD 1.3.3a Server ready.
331 Anonymous login ok, send your complete email address as your password

problem w tym, że nie wiem teraz jakiej funkcji użyć aby wysłać to hasło.
Kiedy użyłem mojej procedury z argumentem dla hasła mój e-mail niestety eftep
dał taki sam rezultat jak powyżej :/

Może jeszcze jakieś pomysły? :)

0
grzesiekyogi napisał(a):

Może jeszcze jakieś pomysły? :)

Wszystko dotyczące protokołu FTP jest tutaj: http://tools.ietf.org/html/rfc959

0
-123oho napisał(a):
grzesiekyogi napisał(a):

Może jeszcze jakieś pomysły? :)

Wszystko dotyczące protokołu FTP jest tutaj: http://tools.ietf.org/html/rfc959

Niestety tutaj niewiele jest - owszem bogaty opis samego protokołu, statusy (mój status
331 - konieczne hasło). Wszystko gra. Problem w tym, że nie wiem jak wysłać to hasło
na serwer używając wininet :/ Próbowałem FtpCommand - ale coś mi nie wyszło :/.

0

Może tak
anonymous:[email protected]

0

Próbowałem FtpCommand - ale coś mi nie wyszło

To zrób tak żeby wyszło, z dokumentacji można pewnie dużo wyczytać na ten temat. Możesz też podejrzeć jakie komendy wysyła FileZilla.

1

przed

{ Change directory }
  bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));

wstaw

FtpCommand(hFTP, false, FTP_TRANSFER_TYPE_ASCII, PChar('PASS [email protected]'), 0, nil)
0

Powoli załamuje ręce:/

Może tak
anonymous:[email protected]

Niestety nie działa :( - efekt ten sam

To zrób tak żeby wyszło, z dokumentacji można pewnie dużo wyczytać na ten temat. Możesz też podejrzeć jakie komendy wysyła FileZilla.

Zainstalowałem FZ - program prowadzi rozmowę z serwerem i początek jest taki sam jak u mnie
również wyskakuje status 331 "Anonymous login ok, send your complete email address as your password"
Problem w tym że FZ umie wysłać polecenie PASS - ja niestety tego nie umiem :/

FtpCommand(hFTP, false, FTP_TRANSFER_TYPE_ASCII, PChar('PASS [email protected]'), 0, nil)

Misiekd - widzę, że się zagłębiłeś w składnię FtpCommand - też to próbowałem.
Problem jest w tym, że pierwszy argument hFTP pochodzi z problematycznej funkcji InternetConnect,
niestety on ma wartość nil :/ Dlatego funkcja FtpCommand nie działa (jest to błędne koło
nie mogę wysłać polecenia PASS na serwer bo nie mam do niego dostępu - a nie mam dostępu
bo nie mogę wysłać hasła). Jakoś musi dać się to ominąć za pomocą WinApi - niestety cały dzień
przesiedziałem i nie mam zielonego pojęcia jak.

0

Wróciłem z jak to określił @-123oho "wakacji", które były w sumie krótkim wyjazdem daleko poza rodzinne miasto, no i mam do autora wątku parę pytań:

  1. Czy ktoś zabronił Tobie sprawdzić jakie dokładnie dane do logowania podaje Total Commander pod jakimś Snifferem jak na przykład WireShark?

  2. Po co korzystasz z funkcji, które o ile się orientuje są zależne od zainstalowanego w systmie IE? Dlaczego zamiast tego nie skorzystać z Synapse, czy użycia tego pakietu również ktoś Tobie zabronił? Jest darmowy, posiada dokumentacje oraz przykłady użycia.

  3. Z podglądu logowania z pod Total Commandera dokonanego WireSharkiem z ustawionym fikcyjnym e-mailem w wcx_ftp.ini takim jak widać poniżej wszystko jasne:

220 ProFTPD 1.3.3a Server ready.

USER anonymous

331 Anonymous login ok, send your complete email address as your password

PASS [email protected]

Logowanie zakancza się powodzeniem. Również z prostego klienta FTP napisanego z użyciem Synapse. Źródła nie dostaniesz, bo źródła ode mnie się skończyły, bo rzekomo zacząłem wysyłać malware, ludziom przez to zaczęły wybuchać komputery. Ogólnie tragedia i chaos. Dlatego zaprzestałem takich praktyk, bo mimo nabicia sobie ponad 2000 postów w tematach dotyczących Delphi i Pascala głupimi i nic nie wnoszącymi odpowiedziami, które nigdy nikogo nie nawet ciutkę nie naprowadziły na rozwiązanie problemów nagle miałbym pisać z sensem. To nie dla mne ;> Także podsumowując. Spróbuj z Synapse. I koniecznie używaj TBrain. Do niezbędny składnik w Delphi lub FPĆ każdego programisty próbującego pisać w tym języku. I nie korzystaj z jakiś badziewnych funkcji. Czasami za dużo "nakładek" na inne systemowe funkcje może nie wyjść na dobre. Ewentualnie jeśli nie Synapse to pobierz sobie SimpleTCP Mateusza Piechnata i zrób logowanie oraz obsługę protokołu FTP w oparciu o sockety i ten świetny moduł. Linkami do RFĆ i opisu protokołu jeśli dobrze zauważyłem, już wspomogli poprzednicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1