Array gibt zuviel aus



  • #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) {
        fprintf(stderr, "%s: %s\n", Message, strerror(errno));
        exit(EXIT_FAILURE);
    }
    
    int main() {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
        int sock, length, len;
        char *request, *suchstrptr;
        char Pass[] = PASS;
        char User[] = USER;
        char receive[length];
        char suchstring[] = "331";
        suchstrptr = suchstring;
    
        sock = socket( AF_INET, SOCK_STREAM, 0 );
        if (sock < 0) err0r("Fehler bei socket()");
        memset( &server, 0, sizeof (server));
        if(( addr = inet_addr(SERVER)) != INADDR_NONE) {
            memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length );
        }
        else {
            host_info = gethostbyname(SERVER);
            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");
    
    //USER
        length = 37;
        request = User;
        len = strlen(request);
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recv(sock,receive,length,0);
        printf("%s",receive);
    
    //PASS
        request = Pass;
        len = strlen(request);
        while(strstr(receive, suchstring) == NULL)  {
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        printf("in der schleife\n");
        receive[length] = '\0';
        recv(sock,receive,length,0);
        printf("%s",receive);
        }
        printf("nach der schleife\n");
        receive[length] = '\0';
        recv(sock,receive,length,0);
        printf("%s\n",receive);
        close(sock);
        return EXIT_SUCCESS;
    }
    

    Das ist mein C programm für einen linux ftp client. Da die Frage nicht linux spezifisch ist, sondern eher grundlegend C denke ich, dass ich hier im Unterforum richtig bin.

    Tyson@Tyson:~/Desktop/ftpfun$ ./ftp
    220 Welcome FTP server ready.
    in der schleife
    331 Password required for linuss
    ��nach der schleife
    230 User linuss logged in
    inuss
    ��
    

    Das ist die Ausgabe. Ihr könnt euch bestimmt schon denken, wo das Problem ist. Ich bekomme komische Fragezeichen ausgegeben und vom letzten string noch mitgenommen dieses gewisse "inuss".
    Also, die Fragezeichen kommen von dem zu großen array und das "inuss" kommt vom nicht-Löschen des arrays. Ich habe danach gegoogelt und auch ähnliche Probleme gefunden. Doch das mit '\0' will irgendwie nicht so recht hinhaun.
    Die fragezeichen kann ich eigentlich gar nicht beheben, oder? ich kann length ja nicht direkt festsetzen, weil ich nicht weiß, wieviel ich jeweils empfange...

    Ich würde mich auf eine rasche Antwort freuen.



  • bytes = recv(conn, &buffer, sizeof(buffer), 0);

    dann weißt du, was angekommen ist. Recv liefert die empfangenen Bytes.



  • #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) {
        fprintf(stderr, "%s: %s\n", Message, strerror(errno));
        exit(EXIT_FAILURE);
    }
    
    int main() {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
        int sock, length, len, zaehler;
        char *request;
        char Pass[] = PASS;
        char User[] = USER;
        char receive[length];
        char suchstring[] = "331";
        size_t recvsize;
    
        sock = socket( AF_INET, SOCK_STREAM, 0 );
        if (sock < 0) err0r("Fehler bei socket()");
        memset( &server, 0, sizeof (server));
        if(( addr = inet_addr(SERVER)) != INADDR_NONE) {
            memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length );
        }
        else {
            host_info = gethostbyname(SERVER);
            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");
    
    //USER
        length = 37;
        request = User;
        len = strlen(request);
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        for(zaehler = 0; zaehler > recvsize; zaehler++) {
            recvsize = recv(sock,receive,length,0);
        }
        printf("%s",receive);
    
    //PASS
        request = Pass;
        len = strlen(request);
        while(strstr(receive, suchstring) == NULL)  {
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sock,receive,length,0);
        printf("%s", receive);
        }
        recvsize = recv(sock,receive,length,0);
        printf("%s\n",receive);
        close(sock);
        return EXIT_SUCCESS;
    }
    

    der Fehler wurde doch noch nicht behoben. Ich bekomme die Anzahl von bytes geliefert. man kann ja in printf angeben, wieviele Zeichen ausgegeben werden. Doch wie füge ich das size_t ein? printf("%\%d\s", recvsize, receive); geht nicht. Wenn ich das mit ner for schleife ausgeben will funzts auch nit...

    #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) {
        fprintf(stderr, "%s: %s\n", Message, strerror(errno));
        exit(EXIT_FAILURE);
    }
    
    int main() {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
        int sock, length, len, zaehler;
        char *request;
        char Pass[] = PASS;
        char User[] = USER;
        char receive[length];
        char suchstring[] = "331";
        size_t recvsize;
    
        sock = socket( AF_INET, SOCK_STREAM, 0 );
        if (sock < 0) err0r("Fehler bei socket()");
        memset( &server, 0, sizeof (server));
        if(( addr = inet_addr(SERVER)) != INADDR_NONE) {
            memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length );
        }
        else {
            host_info = gethostbyname(SERVER);
            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");
    
    //USER
        length = 37;
        request = User;
        len = strlen(request);
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sock,receive,length,0);
        for(zaehler = 0; zaehler != recvsize; zaehler++) {
        printf("%s",receive);
        }
    
    //PASS
        request = Pass;
        len = strlen(request);
        while(strstr(receive, suchstring) == NULL)  {
        if (send(sock, request, len, 0) != len)
            err0r("Mehr bytes versendet, als erwartet");
        recvsize = recv(sock,receive,length,0);
        for(zaehler = 0; zaehler != recvsize; zaehler++) {
        printf("%s",receive);
        }
        }
        recvsize = recv(sock,receive,length,0);
        for(zaehler = 0; zaehler != recvsize; zaehler++) {
        printf("%s",receive);
        }
        close(sock);
        return EXIT_SUCCESS;
    }
    

    Mir sieht es so aus, als hätte ich bei jedem Beispiel jeweils einen Fehler gemacht. Doch welchen?



  • Ohne den Code jetzt näher analysiert zu haben - du bekommst doch
    die Laenge deines Strings mit den bytes.
    strncpy(ausgabefeld, eingabefeld,bytes) oder eingabefeld[bytes] = 0.
    Woher soll printf wissen, ohne 0-Terminator, wo dein String aufhören soll ?


Anmelden zum Antworten