electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007
-
18 mars 2007 à 19:52
victorcoasne
Messages postés1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 2023
-
22 mars 2007 à 18:29
bonjour,
en fait pour lire dans un fichier j'utilise la boucle suivante:
vector <string> Vector;
while (!fichierEnvoye.eof())
{
fichierEnvoye.read(Paquet,1400);
Vector.push_back(Paquet); //on stocke chaque ligne du fichier lu dans un tbl de vector
vider(Paquet);
}
la lecture marche tres bien avec les fichier.txt, mais une fois j'essaye d'ouvrir des fichier.doc ou .pdf ou autres, ça bloque dans la 1ere iteration
auriez vous une idee de ce qui cloche dans cette boucle ? peut etre l'utilisation des string ou la classe vector ??
CCJ
Messages postés565Date d'inscriptionmercredi 19 mai 2004StatutMembreDernière intervention30 avril 20081 18 mars 2007 à 20:28
Salut.
Il te faut lire en mode binary.
Dans ton cas en it / bit. donc des paquet le splus petit possible(la taille d'un carractere). enssuite, tu li ce paquet, si il est egal a NULL , tu lis le suivant , et ceci jusqua une limite que tu as fixé(tu peu fixé cette limite en fonction de la taille du fichier).Si en chemin tu tombe sur un carractere diferent de null , du remet le compteur a zero.Si toutefois il ny a que des null jusqua cette limite c'est que tu a atteint la fin du fichier.
Dsl de ne pas pouvoir taider davantage mais je suis plutot axé Vb.
Sinon recherche sur le forum "Lire fichier bianaire" ou "for binary"...au pire msdn.
Voila onne chance
Si l'informatique été de l'alcool il y aurait des genies partout
else
{
//
nombre_de_caractere est le nombre de caractère reçu
// Attention ! C'est cette variable qui indique le nombre de caractère à écrire et non pas strlen()
// Je conseille donc d'écrire manuellement par boucle for caractère par caractère
}
Un autre truc c'est juste le code de réception mais il faut que tu vérifie si
nombre_de_caractere correspond à ce que tu devais reçevoir dans un for afin de continuer de reçevoir la suite
electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007 18 mars 2007 à 20:44
ben merci,
j'ai fait la lecture en mode binaire, ça regle en partie le probleme, maintenant j'arrive au moins a lire tout le fichier.
sauf que le fichier je le lis pr l'envoyer ensuite a un distinataire, mais ya des caracteres qui sont pas bien afficher qd j'ouvre le fichier reçu.
peut etre que je dois changer qlq chose dans la fonction qui ecrit les paquets reçus dans le code du recepteur ?
CCJ
Messages postés565Date d'inscriptionmercredi 19 mai 2004StatutMembreDernière intervention30 avril 20081 18 mars 2007 à 20:55
surement la norme ISO qui doit diferéré dune fonction a lautre :/
Desolé mais je ne suis pas qualifié pour taider
Cependant dautre on deja eut ce pb... une recherche approfondie pourra peutetre taider.
Au pire post un autre message sur le forum , avec ton code.
Et si ma premiere reponse te convient , check "Reponse acceptée "
Si l'informatique été de l'alcool il y aurait des genies partout
Vous n’avez pas trouvé la réponse que vous recherchez ?
j'utilise les string pcq j'ai besoin d'inserer des entetes dans chaque paquets pr identifier les duplica pcq j'utilise UDP et je dois m'assurer de la bonne reception des paquets.
electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007 19 mars 2007 à 03:42
j'ai oublié de préciser que j'envoi la taille de fichier au debut, pr que le recepteur sache qd est ce que il faut s'arreter de recevoir, et la variable end = taille/1400 +1
pcq chaque paquet que j'envoi contient 1400octet de donnees
electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007 19 mars 2007 à 04:05
la en fait je viens de découvrir un autre probleme dans mon code et j'aimerai bien que vous m'aidiez la dessus.
en fait pour utiliser le mode UDP avec fiabilité, j'exige du recepteur de m'envoyer des ACK a chaque fois qu'il reçoit un paquet, et pour cela j'utilise des timeout sur recvfrom à l'aide de la fonction select( ) pr qu'elle ne bloque pas ou cas ou je ne reçois pas les ACK.
qd j'essaye d'envoyer des fichier de petite taille (qlq Mo) ça marche bien, mais une fois j'essaye d'envoyer des fichier de l'ordre de 40 Mo, la fonction recvfrom n'attend plus l'expiration du delai et m'envoyer toute suite une erreur de reception.
voici le code, seulement la partie ou j'envoi les information sur le fichier au destinataire:
timeval TimeOut; //Timeout pour la reception des acquiescements
TimeOut.tv_sec=5;
TimeOut.tv_usec=0;
char p[1];
itoa(size,p,10); //conversion int to char
string info(UpLoadFile);
string taille=p;
info+="-";
info+=taille;
info+="-"; //fanion
int retval=select(0, &ensemble, 0, 0, &TimeOut);
if(retval) {
recvfrom(sockfd,AckBuf,sizeof(AckBuf), 0,(sockaddr *)&serveur_addr,&serveur_addrLen ); // Recéption des données en provenances du destinataire
cout<<"L'echange peut etre etabli maintenant! "<<AckBuf<<endl;
}
if(retval==0) cout<<"erreur de reception ACK"<<endl;
donc la quand j'essaye d'envoyer un grand fichier, il m'affiche tout de suite "erreur de reception ACK" sans attendre les 5secondes du timeout.
je ne comprend vraiment rien !
electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007 20 mars 2007 à 05:39
l'erreur que j'ai commise, c'etait l'utilisation de p[1] avec itoa pr faire la conversion,
j'aurais du utilisé un tableau plus grand p[10] par exemple, c etait ça qui emepchait select( ) de faire un timeout qd le nombre a convertir devient tres grand.
a propos de ta proposition d'utiliser des char au lieu des string, j'ai pensé à ça aussi mais comme tu px le remarquer, je dois traiter le paquet avant de l'envoyer, ajouter numero de sequence et des trucs de ce genre, et les string me facilitent vraiment la tache, mais si c'est la seule solution qui se presente, je serai alors obligé d'utiliser des char.
en tout cas merci pr votre aide, et si vous avez d'autres propositions, je suis a l'ecoute.
electroonn
Messages postés49Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention27 novembre 2007 21 mars 2007 à 17:50
oh merci man, c vraiment tres gentil de ta part :)
j'aurai une question a propos de la façon dont tu ouvres les fichier, dans ton code tu utilises ça:
ifstream fichiero(adr_fic,ios::in|ios::binary);
ofstream fichiers(nomdefichier,ios::out|ios::binary);
victorcoasne
Messages postés1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 20237 21 mars 2007 à 20:24
Bonjour,
Sinon pour tester ta fonction d'écriture/lecture tu fais un copieur de fichier sans utiliser le réseau (qui duplique le fichier) si le fichier passe c'est que c'est au niveau des sockets sinon c'est que c'est soit la fonction de lecture, soit d'écriture soit les 2.
Si j'ai pas été assez clair dans mon explication tu le dis.
Je reformule, en gros : - Tu copies ton code de lecture dans un nouveau programme
- Tu colles à la suite selui d'écriture (qui va enregistrer le fichier de destination avec un nom différent de celui de lecture)
- Tu vérifies que ça fonctionne et conclus
fichierEnvoye.open(UpLoadFile,ios::in|ios::binary);
if(fichierEnvoye.fail())
{
cout << "Erreur lors de l'ouverture du fichier." << endl;
system("PAUSE");
return;
}
else
{
int t=0;
while (!fichierEnvoye.eof())
{
fichierEnvoye.read(*(Buffer+t),1400);
t++;
/********************************* code d'envoi *****************************/
int dim=size/1400+1; //size est la taille du fichier
char** Buffer=new char*[dim];
LireFichier(UpLoadFile,Buffer); //UpLoadFile contient le nom du fichier
for(int i=0;i<dim;) // Nombre d'iteration = nombre de paquet a envoyer
{
buffer.erase(0,buffer.size()); // On vide buffer
itoa(i,p,10);
buffer=p; // Construction de l'entete du paquet avec le numero de sequence
buffer+='-';
for(int f=0;f<buffer.size();f++) Paquet[f]=buffer[f]; // On copie l'entete dans le paquet a envoyer
for(int g=0;g<1400;g++)
{
Paquet[f]=Buffer[i][g]; // Copie les donnees dans le paquet
f++;
}
nResult=sendto(sockfd,Paquet,BF_SIZE,0,(sockaddr *)&serveur_addr,serveur_addrLen ); // Envoi des paquets
}
/************************** code de reception *******************************************/
victorcoasne
Messages postés1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 20237 21 mars 2007 à 21:53
Bonjour,
Cette ligne de code est incompréhensible : Buffer est un char** et t un entier et tu les mélanges en les additionnants (ce que tu additionne c'est son adresse avec t).
Je te la met mais barré car je peux pas montrer ça.
<strike>fichierEnvoye.read(*(Buffer+t),1400);
</strike>
Merci et bonne prog,
@++