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?
Haben Sie eine Kompilierungswarnung? BTW, du cat ein Zeichen mehr, das du reservierst, weil '\ n' die Dateinamen trennt, was zu undefiniertem Verhalten führt. –
@Serge Ballesta No complie Zeit Warnungen –
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