FTP RFC 959 Problem (ftp Client C linux)



  • Soweit ich das RFC richtig gelesen hab, müsste ich alles richtig gemacht haben. Doch das Problem ist, der ftp server antwortet nicht auf mein LIST. Ich habs mit telnet erfolgreich durchprobiert. Also, ich habe zwei sockets, einer, der die Befehle beantragt und ein anderer für daten. Doch ich krieg von LIST nix zurück...
    der Debugger hilft mir hier auch nix. Ganz einfach, recv kriegt 0 zurück. Also keine nachricht angekommen, nach ner bestimmten Zeit connection close. Hier mein source. In irc's habe ich auch schon rumgefragt, die waren recht ratlos.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    #define PORT 21
    #define RCVBUFSIZE 8192
    #define SERVER "ftp.linuss.li.ohost.de"
    #define PASS "PASS negeropfer\r\n"
    #define USER "USER linuss\r\n"
    
    static void err0r(char *Message);
    static int initsock(char *IP, int Port, struct sockaddr_in server, struct hostent *host_info);
    
    static int initsock(char *IP, int Port, struct sockaddr_in server, struct hostent *host_info) {
        int sock;
        unsigned long addr;
        sock = socket( AF_INET, SOCK_STREAM, 0 );
        if ( sock < 0) 
            err0r("Fehler bei socket()");
        memset( &server, 0, sizeof (server));
    
        if ((addr = inet_addr( IP )) != INADDR_NONE) {
            memcpy( (char *)&server.sin_addr, &addr, sizeof(addr));
        }
        else {
            host_info = gethostbyname(IP);
            if (NULL == host_info)
                err0r("Unkn0wn server");
            memcpy( (char *)&server.sin_addr,
                    host_info->h_addr, host_info->h_length );
        }
    
        server.sin_family = AF_INET;
        server.sin_port = htons( Port );
        if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0)
            err0r("Mehr bytes versendet, als erwartet");
        return sock;
    }
    
    static void err0r(char *Message) {
        fprintf(stderr, "%s: %s\n", Message, strerror(errno));
        exit(EXIT_FAILURE);
    }
    
    int main() {
        int portergebnis;
        int multiplikator;
        int additor; 
        int length;
        int len;
        int sockconnect;
        int sockpasv;
        char *receive;
        char *request;
        char *receivepointer;
        char *p; //pointer für memchr
        char Pass[] = PASS;
        char User[] = USER;
        char syst[10] = "SYST\r\n";
        char feat[10] = "FEAT\r\n";
        char pwd[10] = "PWD\r\n";
        char type[10] = "TYPE I\r\n";
        char pasv[10] = "PASV\r\n";
        char list[10] = "LIST\r\n";
        char suchstring[] = "331";
        char IP[13];
        char IP2[13];
        size_t recvsize;
        struct sockaddr_in server1;
        struct hostent *host_info1;
        struct sockaddr_in server2;
        struct hostent *host_info2;
    
        request = (char *)malloc(500);
        receive = (char *)malloc(500);
        memset(request, 0, 500);
        memset(receive, 0, 500);
        sockconnect = initsock(SERVER, PORT, server1, host_info1);
    
    //USER
        length = 500;
        strcpy(request,User);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("1\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
    //PASS
        strcpy(request,Pass);
        len = strlen(request);
        while(strstr(receive, suchstring) == NULL)  {
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        }
        printf("2\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        recvsize = recv(sockconnect,receive,length,0);
        printf("3\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
    //syst
        strcpy(request,syst);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("4\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
        //feat
        strcpy(request,feat);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("5\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
        //pwd
        strcpy(request,pwd);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("6\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
        //type
        strcpy(request,type);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("7\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
        //pasv
        strcpy(request,pasv);
        len = strlen(request);
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sockconnect,receive,length,0);
        printf("8\n%s\n\n",receive);
    
        //Passive Mode Convert
        receivepointer = receive;
        receivepointer += 26;
        printf("%s\n\n",receivepointer);
    
    /* Eine komplizierte Stelle, fucking Passive mode. Thx an der Stelle bl0b
    <bl0b> die 1. 4 zahlen sind die ip
    <bl0b> 102*255 + 91 = port  (grrr, fast richtig, 102*256+91, und ich such ewig nach dem fehler)
    (213,202,225,41,102,91)
    
    */  memset(IP, 0, 12);
        p = (char *) memchr(receivepointer, ',', 4);
        printf("gefunden an Pos. %d\n", p-receivepointer);
        memcpy(IP, receivepointer, p-receivepointer);
        strncat(IP, ".", 1);
        printf("%s\n",IP);
        receivepointer += ((p-receivepointer)+1);    
        p = (char *) memchr(receivepointer, ',', 4);
        memcpy(IP2, receivepointer, p-receivepointer);
        strncat(IP2, ".", 1);
        printf("%s\n",IP2);
        strcat(IP, IP2);
        printf("Kombiniert: %s\n",IP);
        receivepointer += ((p-receivepointer)+1); 
        p = (char *) memchr(receivepointer, ',', 4);
        memset(IP2, 0, 12);
        memcpy(IP2, receivepointer, p-receivepointer);
        strncat(IP2, ".", 1);
        strcat(IP, IP2);
        printf("Kombiniert: %s\n",IP);
        receivepointer += ((p-receivepointer)+1); 
        p = (char *) memchr(receivepointer, ',', 4);
        memset(IP2, 0, 12);
        memcpy(IP2, receivepointer, p-receivepointer);
        strcat(IP, IP2);
        printf("Kombiniert: %s\n",IP);
    //Multiplikator
        receivepointer += ((p-receivepointer)+1); 
        p = (char *) memchr(receivepointer, ',', 4);
        memset(IP2, 0, 12);
        memcpy(IP2, receivepointer, p-receivepointer);
        printf("Kombiniert: %s\n",IP2);
        multiplikator = atoi(IP2);
        printf("shit nigga: %d\n",multiplikator);
    //Additor
        receivepointer += ((p-receivepointer)+1); 
        printf("%s\n",receivepointer);
        p = (char *) memchr(receivepointer, ')', 4);
        if(NULL == p)
    	printf("memchr nicht erfolgreich\n");
        memset(IP2, 0, 12);
        memcpy(IP2, receivepointer, p-receivepointer);
        printf("Kombiniert: %s\n",IP2);
        additor = atoi(IP2);
        printf("shit nigga: %d\n",additor);
    
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
        //Portergebnis
        portergebnis = ((multiplikator*256) + additor);
        printf("%d*256+%d= %d\n",multiplikator, additor, portergebnis);
    //Socket für Passive Mode
        printf("Connecting to %s:%d\n", IP, portergebnis);
        sockpasv = initsock(IP, portergebnis, server2, host_info2);
        printf("Connected\n");
    
        //list
        strcpy(request,list);
        len = strlen(request);
    
        if (send(sockconnect, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        printf("jetzt recv\n");
        recvsize = recv(sockconnect,receive,length,0);//150 Opening ASCII mode data connection for file list\r\n226 Transfer complete empfangen
        printf("9\n%d\n\n",recvsize);
        memset(receive, 0, recvsize);
        recvsize = recv(sockpasv,receive,length,0);//Ordnerstruktur empfangen...
        printf("9\n%s\n\n",receive);
        memset(receive, 0, recvsize);
        memset(request, 0, 500);
    
        free(request);
        free(receive);
        close(sockconnect);
        close(sockpasv);
        return EXIT_SUCCESS;
    }
    

    Ich weiß, dass es nicht perfekt programmiert ist und man Prozesse, wie die ftp Befehle senden besser mit ner funktion löst, aber es geht in erster Linie um die Funktion des Programms. Die Optimierung des Quelltextes/geschwindigkeit des programms kommt noch.



  • Optimieren kommt noch? Wann? Es ist keine gute Idee, 200-zeilige Funktionen zu schreiben, die liest sich nämlich niemand gerne durch. Zeig uns ein Minimalbeispiel, das Dein Problem illustriert, dann ist die Wahrscheinlichkeit, dass Dir geholfen wird, wesentlich höher.


Log in to reply