Envoi de fichiers en TCP - C - Programmation
Marsh Posté le 27-12-2004 à 11:12:45
En fait je viens de voir que sendfile n'utilise pas de socket.
Alors existe il des fonctions qui envoit et recoit des fichiers avec les sockets?
Pierre
Marsh Posté le 27-12-2004 à 11:50:12
Pev a écrit : En fait je viens de voir que sendfile n'utilise pas de socket. |
sendfile n'est pas complètement portable (pas sous windows en tout cas), mais par contre, c'est une des meilleures solutions pour copier le contenu d'un fichier vers un descripteur quelconque, que ce soit un autre fichier, un pipe, ou une socket (change de lunettes, parce que google "man sendfile" te renvoie immédiatement une page qui te parles de socket).
L'intérêt, c'est que c'est le noyau qui fait tout le boulot, donc les données ne sont pas copiées de l'espace système vers l'espace mémoire utilisateur, puis réciproquement. C'est une des méthodes qu'utilise d'ailleurs Apache si je ne m'abuses. L'inconvénient, comme je l'ai dit, c'est que c'est pas très portable.
Le mieux si tu vises la portabilité, c'est de lire ton fichier bloc par bloc, et de l'envoyer avec un write(socket-id, donnees, taille) ou un truc comme ca.
Marsh Posté le 27-12-2004 à 12:55:59
Merci du renseignement, mais je n'arrive exploiter la fonction sendfile (je prefere rester sous linux) en depit d'avoir lu le "man sendfile".
Pourrais tu m'expliquer un envoi de fichier où un client envoie un fichier et le serveur le recoit?
Merci
Marsh Posté le 27-12-2004 à 17:18:10
le mieux c'est d'envoyer par buffer!
tu fé un buf genre 8192, et tu le "send" ou tu le "write" ds ta socket tant que tu n'as pas atteint la taille du fichier (si il est > à 8192 octets bien sur )!
pour obtenir la taille de ton fichier tu fé un fseek qui se positionne à la fin de ton fihier et il te renverra sa taille!
Marsh Posté le 27-12-2004 à 19:07:16
Ben s'il peut utiliser sendfile ca sera toujours mieux qu'utiliser des buffers...
Marsh Posté le 28-12-2004 à 12:39:53
faire son propre sendfile, c'est pas mal non plus!!
et au - c'est portable
Marsh Posté le 28-12-2004 à 17:17:03
Sauf que ton sendfile n'evitera pas les multiples copyin/copyout, que sendfile() permet justement d'eviter.
Marsh Posté le 27-12-2004 à 10:41:15
Bonjour tout le monde,
J'aimerais envoyer des fichiers en mode connecté grâce aux sockets sous linux, pour l'instant j'envoi ligne par ligne mais j'ai vu dans le man une fonction sendfile, marche-t-elle correctement et comment fait on pour recuperer les fichiers envoyés? (recvfile ??)
Sinon existe il d'autres fonctions toutes faites?
Merci
Pierre