[C] Mmappage de fichiers

Bonjour, je suis en train de me prendre la tête sur un problème de mappage de fichier pour transférer des fichiers depuis un client vers un serveur. Les fichiers à transférer doivent se faire via mmap, et par bloc de 4Ko.
Pour une requête PUT, le client envois un fichier vers le serveur. Je commence donc par envoyer le nom ainsi que la taille du fichier. Ensuite, je map chaque blocs et je les envois vers le serveur avec send. voici le code :

//On parcours le fichier en transmetant chaque bloc char* fmap; int bloc; bloc= 1; while (bloc<=nbBloc){ //s'il reste moins que MAXDATA bytes à transferer if ((bloc*MAXDATA) > infoFile.st_size){ int tmp; tmp = infoFile.st_size- (bloc*(MAXDATA-1)); fmap = mmap(NULL, tmp, PROT_READ, MAP_PRIVATE, fileDescriptor, bloc*MAXDATA); } else{ fmap = mmap(NULL, MAXDATA, PROT_READ, MAP_PRIVATE, fileDescriptor, bloc*MAXDATA); } if (fmap == MAP_FAILED){ printf("Erreur lors du mappage du fichier."); return -1; } //Envois du bloc len = strlen(fmap); bytesSend = send(socketfd, fmap, len, 0); printf("Envois du bloc %i/%i.",bloc,nbBloc); bloc++; }

Coté serveur, c’est à peu près la même chose, sauf qu’on créé le fichier, et on alloue l’espace disque avec ftruncate avant de le récupérer :

//ouverture du fichier content_Fd = open(fileName, O_CREAT | O_WRONLY); if (content_Fd<0){ printf("Server: Open file %s failled \n", fileName); return -1; } //reservation de la memoire if (ftruncate(content_Fd, taille) != 0){ printf("Server: Ftruncate failled \n"); return -1; } int nbBloc; //nombre de bloc a transmettre nbBloc = ceil((double)taille/(double)MAXDATASIZE); //boucle de reception du fichier int bloc; bloc= 1; while (bloc<=nbBloc){ //attente donnée if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) { printf("Server: received failled \n"); return -1; } //s'il reste moins que MAXDATASIZE bytes à transferer if ((bloc*MAXDATASIZE) > taille){ int tmp; tmp = taille - (bloc*(MAXDATASIZE-1)); addr = mmap(NULL, tmp, PROT_WRITE, MAP_SHARED, content_Fd, bloc*MAXDATASIZE); } else{ addr = mmap(NULL, MAXDATASIZE, PROT_WRITE, MAP_SHARED, content_Fd, bloc*MAXDATASIZE); } if (addr == MAP_FAILED){ printf("Erreur lors du mappage du fichier."); return -1; } char *ptr; int i = 0;//iterateur du buffeur //on mappe le contenu for (ptr = addr; ptr <= addr + numbytes -1; ptr++){ *ptr = buf[i]; i++; } printf("Server: Reception du bloc %i/%i.",bloc,nbBloc); bloc++; }//fin reception donnee

Lorsque ce code est exécuté, le serveur plante au moment du mappage. Ma question est donc : Comment marche ce foutu mappage? Lors que j’appelle la fonction mmap, le paramètre size correspond a la taille totale du fichier ou simplement au bloc transféré?
A noter que MAXDATAFILE ou MAXDATA correspond aux 4Ko.
Merci pour votre aide.

Pourquoi ça doit se faire via mmap ? mmap ça sert complètement pas à ça en général, read/write me paraissent largement plus appropriés.

Je n’ai PAS le choix. je DOIS passer par mmap avec des blocs de 4Ko. Ca tiendrait qu’à moi, je passerai par un autre moyen.

k

Il y a moyen de connaitre la raison?

Et 2ement, tu peux pas essayer de faire le soft SANS mmap (pour voir s’il fonctionne) et utiliser mmap pour “respecter” une quelconque obligation?

LoneWolf
Pourquoi faire simple quand on peut faire complique?

La reponse est simple : Monsieur le professeur veut que ce soit ainsi fait. Apparement c’est le seul moyen qu’il ait trouvé pour nous forcer à utiliser le mappage.
Pour ce qui est de faire le code sans mmap, je vois pas l’utilité (mis a part ne plus etre emmerdé par mmap :stuck_out_tongue: )

Dexter qui prefere coder en C alors qu’il prefere Java.

(trouve toi un bon binome mon poney)
(il a changé ces labos Claude?)

Tu fais un strlen() sur ton fichier mappe, est-ce normal ?

Pourquoi ton mapping est tantot prive tantot shared ?

Pourquoi ton fichier cote serveur est ouvert en ecriture seule alors que c’est incompatible avec les operations de mapping ?

C’est bon, apres quelques changements, j’ai reussit a faire marcher cette chiotte. Fallait faire attention aux droits sur le fichier (mode du open) et passer directement le retour de mmap dans le recv. Je synthetise, mais en gros c’est ca.
En tout cas, merci pour votre aide qui me fut fort utile :stuck_out_tongue: