Klient FTP, odbieranie wiadomości serwera.

0

Bazując na RFC i winsock references piszę klienta FTP. Zauważyłem że po wysłaniu komendy serwer drukuje mi odpowiedź do komendy którą wysłałem wcześniej i nie wiem czemu tak się dzieje. Wygląda to tak:

int Cftp::LogIn(char *csUser, char *csPass)
{
    /* Sprawdzenie flagi polaczenia
            sprawdzanie stringow itp */

    SendCmd((char*)strUserCmd.c_str(),'3');

    //punkt 1

    SendCmd((char*)strPassCmd.c_str(),'3');

    //punkt 2   
    return 1;
}
//*******
int Cftp::CurrentDir()
{
    /* Sprawdzenie flagi polaczenia
            sprawdzanie stringow itp */

    SendCmd("PWD", '2');

      //punkt 3

    return 1;
}

Po wywołaniu w punkcie pierwszym dostaję odpowiedź że serwer czeka na usera, mimo że serw wyświetla we własnej konsoli że login ok.
W punkcie drugim dostaję odpowiedź że login ok i serwer czeka na hasło, w kosnoli serwera widzę natomiast że user jest już pozytywnie zalogowany.
W punkcie trzecim zamiast ścieżki dostaję wiadomość że jestem poprawnie zalogowany.
Tak wygląda metoda którą wysyłam komendy:

int Cftp::SendCmd(char *csCmd, char cExpAns)
{

    /* Sprawdzenie flagi polaczenia
            sprawdzanie stringow itp */

    //strcpy(cCmdBuf, csCmd);

    sprintf(cCmdBuf,"%s\r\n",csCmd);//przepisanie, powrot karetki i nowa linia
    if(net_send(ftpHandle->nSock, cCmdBuf, strlen(cCmdBuf))<=0)
    {
        perror("send");
        return 0;
    }
    if(net_read(ftpHandle->nSock, ftpHandle->cResponse, sizeof(ftpHandle->cResponse))<=0)
    {
        perror("read");
        return 0;
    }

    if(cExpAns!=ftpHandle->cResponse[0]){       
        return 0;}
    return 1;
}

Gdzie net_read i net_send to tylko:

#define net_send(x,y,z) send(x,y,z,0)
#define net_read(x,y,z) recv(x,y,z,0)

Znalazłem gdzieś kod odbierania z jakiejś biblioteki i tam było z tym trochę zabawy. Kod jednak był tak nieprzystępny że ciężko cokolwiek z niego wynieść (mnóstwo zmiennych ponazywanych "var" "var2" "x" "z" itp).
Serwer FTP stawiam programem CesarFTP na localhoście.

0

Nie edytuję bo pewnie i tak nie doczytacie tej cegiełki ;-P na razie radzę sobie przez wysyłanie NOOP na serwer ("nic nie rób") wtedy otrzymuję odpowiedź poprzedniej akcji ale jest to męczące. Jeśli ktoś wie dlaczego tak się dzieje, proszę niech mnie oświeci.

0

A po połączeniu się z serwerem odbierasz odpowiedź, którą Ci wysyła?

0

Tak. Powiem więcej, gdy próbuję wysłać jakieś polecenie bez uprzedniego zalogowania się dostaję piękny komunikat by najpierw się zalogować używając polecenia USER.

Ale teraz jak czytam wszystkie komunikaty od serwera dostaję je w takiej kolejności jak powinny się pojawiać. To możliwe, że po wysłaniu komunikatu serwer nie nadpisuje swojego bufora?

0

Nie rozumiem pytania. O co chodzi z tym nadpisywaniem?

0

Several - moze przechowuje kilka ostatnich komunikatow(historie)? Tak btw to przetestuj to na jakims "zewnetrznym" serwerze.

na razie radzę sobie przez wysyłanie NOOP na serwer ("nic nie rób") wtedy otrzymuję odpowiedź poprzedniej akcji ale jest to męczące. Jeśli ktoś wie dlaczego tak się dzieje, proszę niech mnie oświeci.
Bardzo radosny strzal - oczekuje na sygnal zakonczenia komunikatu(lub cos w podobie)? Sprawdz wiresharkiem jak wyglada komunikacja np filezilli z serwerem i czym sie roznie od tego co wysyla Twoj program.

0

@_0x666_: Chodzi o to że wcześniej w metodzie w której łączyłem się z serwerem nie odczytywałem odpowiedzi serwera. Miałem sprawdzanie błędu dla socket() i connect() więc uznałem że nie potrzebuje robić kolejnej akcji. Wtedy miałem taką przypadłość jaką opisałem w pierwszym poście.
Teraz gdy w metodzie w której się łączę odbieram odpowiedź serwa pozostałe komunikaty pojawiają się w spodziewanych miejscach. Stąd taki mój prymitywno-myślowy wniosek z poprzedniego postu i lekka konsternacja czy to możliwe ;)
@cyriel: Obadam i zamelduje.

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