Bonjour tout le monde
Je cherche actuellement a faire, dans le cadre d'un serveur, une lecture de fichiers binaires de X octets, faire l'envoi au client, puis refaire une lecture de X octets... Ceci, afin de ne pas bloquer les autres clients lorsqu'un telecharge un gros fichier par exemple. Mais voila, ma lecture via les ifstreams ne marche absolument pas, et je suis completement perdu Quelqu'un aurait il une idee ?
(Precision: je suis dans le cas ou le fichier est un binaire, une image en l'occurence pour mes tests)
Voila, j'ai essaye d'expliquer mon code au mieux ! J'avais aussi essaye avec la solution du get vu que d'apres les mans c'est pour les strings non formates, mais rien de mieux !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 fileStream.open(file.c_str(), ios_base::in | ios_base::binary); //file est un string recuperee dans un autre endroit du code cerr << "opened ? " << fileStream.is_open() << endl; // affiche 1 cerr << "good ? " << fileStream.good() << endl; // affiche 1 request.append("\r\nContent-Length: "); fileStream.seekg(0, ios_base::end); size = fileStream.tellg(); oss << size; request.append(oss.str()); request += "\r\n"; request.append("Accept-Ranges: bytes\r\n"); request.append("Connection: keep-alive\r\n\r\n"); // Separation du header et du body par une paire de "\r\n" if (*idx > 0){ //*idx est un pointeur sur un int qui permet de reprendre la lecture la ou on l'avait laissee... cerr << "clearing request\n"; request.clear(); // si on passe ici, on a pas besoin de header (en theorie) fileStream.seekg(*idx); } else fileStream.seekg(0, ios_base::beg); long pos = (long)fileStream.tellg() - *idx; // Je souhaitais pouvoir me placer dans mon tmp pour mettre le '\0', mais tellg me renvoit toujours -1 :( cerr << "opened ? " << fileStream.is_open() << endl; // renvoi 1 cerr << "good ? " << fileStream.good() << endl; // renvoi 1 fileStream.read(tmp, 4095); // char tmp[4096]... 1 octet pour mettre le '\0' (habitude unix... bonne ou pas ?) cerr << "tellg: " << (long)fileStream.tellg() << endl; // renvoi -1 cerr << "idx: " << *idx << endl; // renvoi 0 cerr << "pos: " << pos << endl; // renvoi -1 //tmp[pos] = '\0'; // donc logiquement ca pete ici *idx = (long)fileStream.tellg(); // je garde en memoire la valeur de lecture pour reprendre plus tard if (*idx == size){ // si le fichier est complet, on met idx a -1 pour que la fonction appellante close la socket. cerr << "Reseting *idx to -1"; *idx = -1; request.append(tmp); request += "\r\n"; } else request.append(tmp);
Merci d'avance
EDIT :: Me suis plante dans le sens entre ma lecture et l'appel aux methodes good et is_open. J'ai remis ca en ordre
Partager