Odbieranie plików przez FTP - passive?

0

Witam
Potrzebuję napisać program, który będzie pobierał plik z serwera FTP.
Zalogowałem się na serwer wiem jak ustawiać sobie katalogi itp. Ze specyfikacji FTP-a wyczytałem rownież, że do sciagania plików służy komenda RETR jakis_plik. Więc wysyłam takie zapytanie a w buforze otrzymuje
Opening ASCII mode data connection for jakis_plik (486 Bytes).

i to jest wszystko. Nie mam pojęcia w jaki sposób mam odebrać plik i zapisać go na dysk. Proszę o sugestie. Poniżej zamieszczam kod mojej procedury do recv() :

void recive_f(SOCKET sock, char buf[DEFAULT_BUFLEN], int buflen){
     int result=0;
     
                   result = recv(sock, buf, buflen, 0);
                   cout<<endl<<result;
                       ofstream fwrite("pliczek.txt",ios::binary);
                   if ( result < 0 )
                        printf("Recv failed: %d\n", WSAGetLastError());
                   else if ( result == 0 )
                        printf("Connection closed\n");
                   cout<<buf;
                   fwrite.write(buf,1024);
}

a pliku do którego ma niby zapisywać plik mam coś takiego :

150 Opening ASCII mode data connection for jakis_plik (486 Bytes).
                                                                                                                                                                 đ C : \ D ÂD                               %= Ŕ×$ Ŕ×$ ”  WinSock 2.0 

i dalej krzaczki..

To są (jak pewnie widać) początku z programowania socketów w moim wydaniu.

0

Hmm, może tak:

int result;
char buf[500];

ofstream fwrite("pliczek.txt",ios::binary);

while((result = recv(sock,buf, 500, 0))!=SOCKET_ERROR)
{
	if(result==0)break;
	fwrite.write(buf,result);
}

if ( result < 0 )printf("Recv failed: %d\n", WSAGetLastError());
else if ( result == 0 )printf("Connection closed\n");
0

no nie dokońca program się zatrzymuje w momencie pobierania pliku. Na dysku jest tworzony plik o rozmiarze 0b i program nie odpowiada do momentu wysłania przez serwer błędu 10054.
Pobrałem plik przez zwykly dosowy klient ftp i działa bez problemu czyli to nie jest wina serwera.
Pliki mogą mieć różne rozmiary max 2Mb.

0

A utworzyłeś nowe połączenie dla transferu (passive mode)?

0

No to możliwe że to o to chodzi bo nie mam nowego połączenia. Mam utworzyć nowy socket i połączenie

ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
            ptr->ai_protocol);

czy samo połączenie :

iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);

i od razu wtedy wysyłać do serwera PASV zeby przejsć do trybu pasywnego i pozniej pobierac plik ?

Czy to się tworzy połączenie w jakiś inny sposób.

0

No to możliwe że to o to chodzi bo nie mam nowego połączenia.

Ono musi być. Dla transferu plików musisz utworzyć nowe połączenie na innym porcie. W trybie pasywnym serwer podaje IP i port, pod który klient musi się połączyć - wysyłasz komendę PASV, w odpowiedzi dostaniesz:

227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)

gdzie:
a1,a2,a3,a4 - to IP
p1, p2 - numer portu (p1*256+p2)

W trybie aktywnym jest odwrotnie - serwer łączy się z klientem (chyba) domyślnie na porcie 20 lub na adres i port podany komendą PORT.

PS. ważne jest, żebyś poprawnie odbierał wielolinijkowe odpowiedzi z serwera.

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