J'ai reçu une tâche à l'école pour écrire un programme FTP en langage C (pour Linux). J'ai toutes les fonctionnalités de base en un rien de temps (ls, cd), mais j'ai des problèmes avec la partie transfert de fichiers. J'utilise sendfile pour envoyer le fichier sur le socket comme celui-ci:Envoyer un fichier via une socket en C
int fd = open(temp, O_RDONLY);
int rc = sendfile (client_fd, fd, &offset, statbuf.st_size);
Je ne peux pas sembler comprendre comment recevoir ce fichier sur le côté client. Je l'ai essayé comme pour le débogage:
while((i = read(sock, message, MSG_LEN - 1)) > 0) {
message[i] = '\0';
printf("%s", message);
}
Cela fait un bon travail à l'impression des fichiers texte, mais si je tente d'envoyer des fichiers binaires, par exemple, il suffit d'imprimer le début du fichier binaire et se bloque à la partie read() (puisque rien ne vient du serveur, je pense).
J'apprécie toutes les suggestions!
Peut-être essayer à nouveau sendfile, avec le descripteur de socket étant l'entrée et un fichier ouvert pour l'écriture en sortie ...? –
Les fichiers BTW/binaires peuvent contenir 0 octet que les fonctions de type C comme printf peuvent confondre avec les terminaisons ASCIIZ NUL, ainsi que d'autres valeurs correspondant aux codes de contrôle ASCII pour effacer l'écran, déplacer le curseur, etc. contenu octet par octet en hexadécimal ou utiliser d'une autre manière pour le rendre lisible par l'homme et compatible terminal. –
Ou utilisez fwrite (message, 1, i, stdout) et redirigez la sortie de votre programme vers un fichier à partir du shell –