elrond | J'ai trouve une fonction sendfile, mais quand je veut transferer un fichier, cela creer un fichier vide
Quelqu'un a deja utilise cette fonction avec des sockets?
Sinon, voyez vous un bug dans cette facon de transferer des fichiers? Ca marche bien pour des petits fichiers, mais pas pour des longs...
L'envoie...
Code :
- void Socket::sendFile(const char * file, const char * rep)
- {
- const int bf_size = BF__SIZE; // Taille du buffer
- char * buffer = new char[BF__SIZE]; // Buffer d'emission
- char real_file[strlen(file)+strlen(rep) +1];
- long i;
-
- strcpy(real_file,rep);
- strcat(real_file,file);
- try{
-
- //[][][][][][][][][][][] [][][][][][][][][][][][]//
- //[][][][][][][][] Avec sendfile [][][][][][][][]//
- //[][][][][][][][][][][] [][][][][][][][][][][][]//
- // int pos = 0;
- // // On commence par envoyé le nom du fichier
- // sendMsg(file);
-
- // // On envoie les droits du fichier
- // struct stat tmp;
- // stat(real_file,&tmp);
- // int droit = tmp.st_mode;
- // sendS(&droit,sizeof(int),0);
- // // On envoie les dates du fichier.
- // // date du dernier accès (pas vraiment utile)
- // sendS(&(tmp.st_atime),sizeof(time_t));
- // cout << "Envoie de la date d'accès : " << tmp.st_atime << endl;
- // // date de la dernière modification
- // cout << "Envoie de la date de modif : " << tmp.st_mtime << endl;
- // sendS(&(tmp.st_mtime),sizeof(time_t));
- // // On ouvre le fichier en lecture
- // ifstream cc_in (real_file, ios::binary);
- // // On recupère la taille du fichier
- // long size = fileSize(cc_in);
- // cc_in.close();
- // // On envoie la taille du fichier
- // sendS(&size,sizeof(long),0);
- // int c_in = open(real_file, O_RDONLY);
- // sendfile(_sock,c_in,(off_t *)&pos,size);
- // close(c_in);
- //[][][][][][][][][] []][][][][][][][][]//
- //[][][][][][][] Normal [][][][][][][][]//
- //[][][][][][][][][] []][][][][][][][][]//
- // On commence par envoyé le nom du fichier
- sendMsg(file);
- // On envoie les droits du fichier
- struct stat tmp;
- stat(real_file,&tmp);
- int droit = tmp.st_mode;
- sendS(&droit,sizeof(int),0);
- // On envoie les dates du fichier.
- // date du dernier accès (pas vraiment utile)
- sendS(&(tmp.st_atime),sizeof(time_t));
- cout << "Envoie de la date d'accès : " << tmp.st_atime << endl;
- // date de la dernière modification
- cout << "Envoie de la date de modif : " << tmp.st_mtime << endl;
- sendS(&(tmp.st_mtime),sizeof(time_t));
- // On ouvre le fichier en lecture
- ifstream c_in (real_file, ios::binary);
- // On recupère la taille du fichier
- long size = fileSize(c_in);
- // On envoie la taille du fichier
- sendS(&size,sizeof(long),0);
- // On calcule le nombre de paquet remplissant le buffer
- long nb_paq = size / bf_size;
- // On envoie l'ensemble des paquets complets
- for ( i = 0; i < nb_paq; i ++)
- {
- c_in.read(buffer,bf_size);
- sendS(buffer,bf_size,0);
- }
-
- // On envoie les derniers octets
- size = size - (nb_paq * bf_size);
- c_in.read(buffer,size);
- sendS(buffer,size,0);
-
- // On ferme le fichier
- c_in.close();
- // On supprime le buffer
- delete [] buffer;
-
- }catch (SocketException & ex)
- {
- delete [] buffer;
- throw ex;
- }
-
- }
|
La reception...
Code :
- void Socket::recvFile()
- {
- const int bf_size = BF__SIZE; // Taille du buffer
- char * buffer = new char[bf_size]; // Buffer de reception
- long size, i; // taille du fichier
-
-
-
- try{
- //[][][][][][][][][][][] [][][][][][][][][][][][]//
- //[][][][][][][][] Avec sendfile [][][][][][][][]//
- //[][][][][][][][][][][] [][][][][][][][][][][][]//
- // // On recupère le nom du fichier à recevoir
- // string file = recvMsg();
- // // On récupère les droits du fichier
- // int mode;
- // recvS(&mode,sizeof(int),0);
- // // On récupère les dates du fichiers.
- // time_t time_file;
- // // Date du dernier accès
- // recvS(&time_file,sizeof(time_t));
- // cout << "On recoit la date d'accès : " << time_file << endl;
- // struct utimbuf utbf;
- // utbf.actime = time_file;
- // // Date de la dernière modification
- // recvS(&time_file,sizeof(time_t));
- // cout << "On recoit la date d'accès : " << time_file << endl;
- // utbf.modtime = time_file;
- // // On récupère la taille du fichier
- // recvS(&size,sizeof(long),0);
- // cout << "Taille du fichier à recevoir :" << size << endl;
- // int fd = creat(file,mode);
- // int pos = 0;
- // sendfile(fd,_sock,(off_t *)&pos,size);
- // close(fd);
- //[][][][][][][][][] []][][][][][][][][]//
- //[][][][][][][] Normal [][][][][][][][]//
- //[][][][][][][][][] []][][][][][][][][]//
- // On recupère le nom du fichier à recevoir
- string file = recvMsg();
- // On récupère les droits du fichier
- int mode;
- recvS(&mode,sizeof(int),0);
- // On récupère les dates du fichiers.
- time_t time_file;
- // Date du dernier accès
- recvS(&time_file,sizeof(time_t));
- cout << "On recoit la date d'accès : " << time_file << endl;
- struct utimbuf utbf;
- utbf.actime = time_file;
- // Date de la dernière modification
- recvS(&time_file,sizeof(time_t));
- cout << "On recoit la date d'accès : " << time_file << endl;
- utbf.modtime = time_file;
- // On ouvre le fichier de destination
- // my_ostream c_out (file, mode);
- ofstream c_out(file);
- // On récupère la taille du fichier
- recvS(&size,sizeof(long),0);
- cout << "Taille du fichier à recevoir :" << size << endl;
- // On calcule le nombre de paquet remplissant le buffer
- long nb_paq = size / bf_size;
-
- cout << "nb de paquet a recevoir " << nb_paq << endl;
-
- // On recoie l'ensemble des paquets complets
- for ( i = 0; i < nb_paq; i ++)
- {
- recvS(buffer,bf_size,0);
- sendChar(0);
- c_out.write(buffer,bf_size);
- }
-
- // On recoie les derniers octets
- size = size - (nb_paq * bf_size);
- recvS(buffer,size,0);
- c_out.write(buffer,size);
- // On ferme le fichier
- c_out.close();
- // On positionne la date du fichier
- utime(file,&utbf);
- // On supprime le buffer
- delete [] buffer;
-
- }catch (SocketException & ex)
- {
- delete [] buffer;
- throw ex;
- }
- }
|
sendS et recvS sont juste des appel a send et recv dans ma class Socket...
Code :
- // Redefinis send et recv pour qu'elles lèvent une exception
- // si une erreur se produit
- // @throws SendSocketException
- inline void sendS(const void * msg, int len, int flags=0)
- {
- int sent = send(_sock,msg,len,flags);
- if ( sent == -1)
- {
- SendSocketException ex;
- throw ex;
- }
- else if (sent != len)
- {
- SendSocketException ex(sent,len);
- throw ex;
- }
- }
- // @throws RecvSocketException
- inline void recvS(void * buf, int len, unsigned int flags=0)
- {
- if (recv(_sock,buf,len,flags) == -1)
- {
- RecvSocketException ex;
- throw ex;
- }
- }
|
|