ftp download

0

Witam!
Prosty kod (na podstawie msdn):

int main()
{
    HINTERNET INT = InternetOpen("client", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
    check(INT);
    HINTERNET FTP = InternetConnect(INT, HOST_FTP, INTERNET_DEFAULT_FTP_PORT, LOGIN_FTP, PASSWORD_FTP, INTERNET_SERVICE_FTP, 0, 0);
    check(FTP);
    bool good = FtpGetFile(FTP, "test.txt", "test.txt", false, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);
    check(good);
    return 0;
}

check() to po prostu moja funkcja informująca o ewentualnym błędzie, kodzie błędu i zamykająca program w razie czego.
Problem w tym, że FtpGetFile() wywala błąd o kodzie 12031 - "The connection with the server has been reset."
Średnio mi to coś mówi, w każdym razie, jeżeli plik usunąłem z ftp kod błędu był taki sam. Czy jakoś nie tak odwołuję się do tego pliku? Na ftp wrzuciłem go bezpośrednio, bez żadnych folderów. Nie wiem co jest nie tak.

0

Nikt nie pomoże? :(
Ludzie, bo ja już osiągnąłem wyżyny frustracji i żyję w skrajnej nerwicy :/
No nie mogę tego samodzielnie rozkminić...
Już mi przychodzą myśli, że może po stronie serwera jest coś nie tak? Ale to raczej niemożliwe, jak się łączę managerem ftp, wszystko jest ok.
Może nie taka konfiguracja połączenia jest? (źle ustawione flagi itp?). Ale jak przeglądałem różne kody źródłowe to właśnie w ten sposób jest to wszędzie zrealizowane. Dodawanie różnych slash'y do ścieżek plików też nic nie daje. Jakiekolwiek firewall-e / antywirusy wyłączone.
Nie mam już żadnych pomysłów, wszystko wydaje się dobrze zrobione...

0

Sprawdź czy możesz łączyć się zewnętrznie z FTP, wiele hostingów na to nie pozwala.

0

Konto ftp założyłem na cba.pl i przy łączeniu się przez program zewnętrzny (FileZilla) nie było żadnych problemów.

0

Hmm, a możecie polecić jakieś inne biblioteki do obsługi ftp??
Tym sposobem się chyba poddaję.

0

curl

0

Wywal flagę INTERNET_FLAG_ASYNC.

0

A co jeśli chodzi o winsock? Kiedyś pisałem prostacki komunikator między dwoma komputerami, da się tym obsłużyć ftp??

@_0x666_
Od razu się rzuciłem na kompilator ;P Niestety...
Hmm, z tego co jest napisane na msdn, to są dostępne trzy flagi w tamto miejsce:
INTERNET_FLAG_ASYNC
INTERNET_FLAG_FROM_CACHE
INTERNET_FLAG_OFFLINE
Z czego dwie ostatnie "does not make network requests".
Oczywiście, próbowałem empirycznie kombinować ;P Ale też nie wychodzi... A w ogóle co dziwne INTERNET_FLAG_FROM_CACHE wywala mi błąd kompilacji.
W każdym razie nie chce działać nadal :/

@othello @xeo545x39
Dzięki, może jakoś w tym mi wyjdzie...

0
HINTERNET hInt = InternetOpen("client", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(hInt)
{
	HINTERNET hFTP = InternetConnect(hInt, "biolpc22.york.ac.uk", INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, 0, 0);

	FtpGetFile(hFTP, "/pub/1.68B/readme.txt", "test.txt", false, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);

	InternetCloseHandle(hFTP);
	InternetCloseHandle(hInt);
}

Tu masz przykład kodu, który ściąga plik z publicznego serwera FTP wxWidgets. NIe byłem w stanie przetestować tego na koncie cba.pl, ale radykalnych zmian w kodzie nie powinno być.

p.s. nie pisz dużymi literami nazw zmiennych. Taki INT jest już zdefiniowany w windows.h.

0

A co jeśli chodzi o winsock? Kiedyś pisałem prostacki komunikator między dwoma komputerami, da się tym obsłużyć ftp??

A czemu ma sie nie dac? Ftp to przecież tylko protokół tcp. Specyfikacja ftp do ręki i jedziesz. Napiszesz sobie od zera bibliotekę do obsługi ftp.

0

@_0x666_
No tak, z tym INT-em rozumiem. Hmm, jak działa Ci ten kod to już nic nie rozumiem - u mnie nie paca. Na komputerze kolegi z pokoju też odpalałem i ten sam błąd wyrzuca... Czyli dla mnie tak to wygląda jakby wina była po stronie sieci? Nie wiem, nie znam się. Ale skoro Tobie działa, u mnie nie działa, u niego nie działa to wyklucza raczej błędy jakieś systemowe (no musielibyśmy je mieć obydwaj), ale z kolei do tej samej sieci jesteśmy podłączeni, więc może tutaj tkwi problem? Spróbuję to jeszcze odpalić w zupełnie innym miejscu... po prostu z braku lepszych pomysłów ;P Niedługo chyba kosmitów zacznę podejrzewać...
Jak znajdę czas to spróbuję pokombinować na winsock, poszperam w necie, coś tam jest.

1

Spróbuj odpalić połączenie w trybie pasywnym:

HINTERNET hFTP = InternetConnect(..., INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
0

@_0x666_
......
Działa!
Jesteś moim mistrzem ;D
Moja klawiatura nie jest w stanie przelać mojej wdzięczności ;) Kurde, dzięki ;)

Problem praktycznie rozwiązany, ale ciekawi mnie jaka była teoretyczna przyczyna? Co oznacza dokładniej ten tryb pasywny?

W ogóle oczywiście wszystkim bardzo dziękuję za zainteresowanie tematem ;)

0

A wiesz w ogóle jak działa FTP-a? http://pl.wikipedia.org/wiki/File_Transfer_Protocol

0

Co oznacza dokładniej ten tryb pasywny?

Ten tryb oznacza, że klient wykonuje dodatkowy request w celu ustalenia na jaki port (socket) ma się podłączyć żeby pobrać dane.

1

Co oznacza dokładniej ten tryb pasywny?

Tryb pasywny oznacza, że klient ustanawia połączenie do przesyłu danych. W trybie aktywnym klient podaje swoje namiary (IP i port), i wtedy serwer łączy się z klientem. Stąd wniosek prosty, że jeśli nie masz publicznego IP, nie masz przekierowanych portów lub po prostu masz je poblokowane, to tryb aktywny nie zadziała. Nie wiem, jaką aplikację robisz, ale zostaw możliwość wyboru między trybami pracy. Tryb pasywny nie musi zawsze działać.

0

No jakbym wiedział jak to wszystko działa to pewnie nie miałbym takich problemów ;)
No tak to jest, ze czasami chcemy coś wykorzystywać w praktyce nie znając podstaw teoretycznych... Przynajmniej mi się to zdarza ;P Ehh, nie ma to jak zdobywać wiedzę od d*** strony, sam jestem sobie winien. W każdym razie już lepiej rozumiem jak to całe ftp działa. Kolejny krok do przodu.
Jeszcze raz dziękuję wszystkim, jak dla mnie temat zamknięty.

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