2017-12-11 3 views
1

Ich versuche, Dateinamen aus einer Dirent-Struktur zu nehmen und eine Liste aller Namen als eine verkettete Zeichenfolge an den Client senden.C: Wie könnte ich eine Liste von Dateinamen als String an einem Socket senden?

Nach ein paar Stunden zu versuchen, es herauszufinden, kann ich nicht richtig Speicher zuordnen, oder lesen Sie es richtig, ich bekomme Nonsense String zurück, so muss es Speicher falsch lesen, obwohl ich denke ich habe die Zeichenfolge mit "\ 0" angehängt

Hier ist, was ich bisher,

Send String Client getan haben:

void send_file_list(int socketNumber) 
{ 

    DIR *mydir; 
    if ((mydir = opendir("upload")) == NULL) { 
    perror("error"); 
    exit(EXIT_FAILURE); 
    } 

    struct dirent *entry = NULL; 

    size_t len; 

    //loop through entry to get size of all filenames as string. 
    while ((entry = readdir(mydir)) != NULL) 
    { 
    len = len + strlen(entry->d_name); 
    } 

    char filelist[len]; 

    //returns NULL when dir contents all processed 
    while ((entry = readdir(mydir)) != NULL) 
    { 
    strcat(strcat(filelist, entry->d_name),"\n"); 
    } 

    closedir(mydir); 

    size_t n = len; 

    writen(socketNumber, (unsigned char *) &n, sizeof(size_t)); 
    writen(socketNumber, (unsigned char *) filelist, n); 

    printf("Sent file list of size %zu bytes\n",n); 

}//end send_file_list() 

Get Zeichenfolge vom Server:

void get_file_list(int socket) 
{ 
    size_t k; 

    readn(socket, (unsigned char *) &k, sizeof(size_t)); 
    char filelist[k]; 
    readn(socket, (unsigned char *) filelist, k); 

    printf("Received: %zu bytes\n\n", k); 
    printf("\n---Files On Server -------------------\n"); 
    printf("%s", filelist); 
    printf("\n--------------------------------------\n"); 

} // end get_file_list() 

witen() und readn() stammen aus einer importierten Datei, rdwrn.c und .h, das war Teil eines Kursarbeitsprojekts, ich bin mir nicht ganz sicher, wie sie funktionieren, aber im Grunde lesen und schreiben sie aus dem gegebenen Steckdose. Ich habe sie nicht gemacht.

Ich bin seit Stunden dabei, und ich fühle, dass es unordentlich wird. Gibt es einen besseren Weg, dies zu tun?

+1

Haben Sie eine Kompilierungswarnung? BTW, du cat ein Zeichen mehr, das du reservierst, weil '\ n' die Dateinamen trennt, was zu undefiniertem Verhalten führt. –

+0

@Serge Ballesta No complie Zeit Warnungen –

+2

Sie verwenden readdir(), um durch die Liste der Dateien zu lesen, um die Länge zu erhalten, dann versuchen Sie erneut readdir(), um die Liste zu verarbeiten ... Sie müssen den Verzeichnisstrom mit schließen closedir() und opendir() erneut, bevor Sie es erneut verwenden. Zweitens, in Ihrer Berechnung der "Länge", erlauben Sie nicht ein "Trennzeichen", wie ein Komma oder eine Newline ... – TonyB

Antwort

0

diese Schleife:

while ((entry = readdir(mydir)) != NULL) 
{ 
len = len + strlen(entry->d_name); 
} 

hat ein paar Probleme.

1) Generisch für den gesamten geposteten Code ist die Einrückung nicht konsistent. Aus Konsistenzgründen, nach jeder öffnenden Klammer '{' einrücken. vor jeder schließenden Klammer '}' einrücken. Schlagen Sie für jede Einzugsebene 4 Leerzeichen vor.

2) In den Verzeichniseinträgen gibt es viele Arten von Einträgen. (Links, Unterverzeichnisse usw. usw.)

Bevor Sie einen bestimmten 'Dateinamen' in die resultierende Zeichenfolge einfügen. der Code muss die Art der Eingabe überprüfen es ist eine normale Datei und der Name der Datei ist nicht . noch

==== sicherzustellen .. die Variablen: len nicht initialisiert werden, empfiehlt die Verwendung von:

size_t len = 0; 

==== anzumerken, dass die Funktion strlen() am Ende der Schnur um den Offset zu dem NUL-Byte zurückzugibt (und Offsets bei 0 beginnen, nicht mehr als 1), so dass die tatsächliche Länge ist 1 Byte

länger = === T Die Frage stellt nicht fest: Ist dieser Code, um nur die aktuellen Verzeichnisdateinamen zu sammeln oder sind es die Dateinamen in den Unterverzeichnissen?

==== Die Frage besagt nicht: sind die Dateinamen zusammen zu jammen oder getrennt durch ein Leerzeichen oder ein Komma. Wenn durch ein Leerzeichen getrennt, was ist mit Dateinamen, die ein Leerzeichen enthalten?

==== BTW: Woher kommen die Funktionsnamen: writen() und readn()?

+0

witen() und readn() stammen aus einer importierten Datei, rdwrn.c und .h, dies war Teil eines Kursarbeitsprojekts, ich bin mir nicht ganz sicher, wie sie funktionieren, aber im Grunde lesen und schreiben sie aus dem gegebenen Socket. Ich habe sie nicht gemacht. –

+0

Dieses Detail hätte im Text der Frage erwähnt werden müssen, nicht in einem Kommentar. – user3629249

+0

Entschuldigung, ich werde es jetzt hinzufügen ... –

Verwandte Themen