Witam, zmagam się z problemem klienta FTP, w języku C, na socketach.
Oto co udało mi się do tej pory zrobić :


#include <winsock.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    WSADATA WSAData;
            char user[] = "anonymous\n";
            char password[] = "[email protected]";
            char reply[3];
            SOCKET sock;                                                    //socket descriptor
            SOCKET dataSocket;                                      //data socket descriptor
            struct sockaddr_in ftpServAddr;                                 //
            struct sockaddr_in dataServAddr;
            struct hostent *clientAdress;
            unsigned short  ServerControlPort = 21;
            unsigned short  ServerDataPort;
            unsigned short  ClientControlPort;
            unsigned short  ClientDataPort;
            char *adress ="ftp.tpnet.pl";
            char *hostname;
            char code[2] ;
            int kod_bledu;
            char *p;
            char buf[1000];

    // funkcja sprawdzajaca odpowiedz serwera

    int reply_c(bufa)
    {
        recv(sock, buf, sizeof(buf), 0);
        char *code =(char*) malloc(3);

        strncpy(code,(char*)bufa,3);
        kod_bledu=atoi(code);

        printf("SERVER RESPONSE: %d \n", kod_bledu, code);

        return(kod_bledu);
    }

    int komenda(char *command)
    {
        if (send(sock, command, strlen(command), 0) == -1) printf("blad wysylania");
    return (0);

    }

    int login()
    {

        do
        {
            reply_c(buf);

           if(kod_bledu == 220)  {
                printf("Logowanie anonimowe...\n");
                komenda("USER anonymous\n");

                reply_c(buf);}

            if(kod_bledu == 331) {
            printf("Password needed\n");
            usleep(1000);
            komenda("PASS [email protected]\n");

            reply_c(buf);
            }
            if (kod_bledu == 230)

            printf("Zalogowano do ftp!\n");}

            while (kod_bledu !=230);
            getchar();
            system("cls");
            return 0;

    }
    int main(int argc, char ** argv)
    {

            printf("Tworze socket stream...\n");

            if( WSAStartup( MAKEWORD( 2, 0 ), &WSAData ) != NO_ERROR )
        {
            printf( "Blad inicjalizacji WinSock2\n" );
            return( 1 );
        }

            if ((sock = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP)) == -1)
            {
                    printf ("Nie moge utworzyc socketa !");
            }

            //data socket
            if((dataSocket = socket(PF_INET, SOCK_STREAM,0))== -1 )
            {
                    printf ("Blad tworzenia data socketa!");
            }
            //konstruowanie struktury server adress
            clientAdress = gethostbyname(adress);
        memset(&ftpServAddr, 0, sizeof(ftpServAddr));
        memcpy(&ftpServAddr.sin_addr, clientAdress->h_addr, clientAdress->h_length);
        ftpServAddr.sin_family         = AF_INET;                 /* Internet address family */
       // ftpServAddr.sin_addr.s_addr    = inet_addr(adress);       /* Server IP address */
        ftpServAddr.sin_port           = htons(ServerControlPort);      /* Server port */

    //laczenie z socketem

        memset(&dataServAddr, 0, sizeof(dataServAddr));         /* Zero out structure */
        dataServAddr.sin_family         = AF_INET;              /* Internet address family */
        dataServAddr.sin_addr.s_addr        = htonl(INADDR_ANY);       /* Server IP address */
        dataServAddr.sin_port           = htons(20); /* Server port */

        if ( connect(sock, (SOCKADDR*) &ftpServAddr, sizeof(ftpServAddr)) == -1)
        {
            printf("Blad polaczenia!");
        }
        else
        {
            printf("Connect ok!\n");
        }
        bind(dataSocket,(struct sockaddr *) &dataServAddr, sizeof(dataServAddr));
        listen(dataSocket,1);

          login();

         komenda("LIST");
          reply_c(buf);
          printf("%s",buf);
          getchar();

    return (0);
    }

Zatrzymałem się na problemie pobierania listy plików z serwera FTP, wiem, że służy do tego funkcja LIST, ale nie bardzo wiem jak się do tego zabrać. Proszę o pomoc, z góry dzięki za wszelkie sugestie ;)