Winsock transfer de fichier [Résolu]

Signaler
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
voila ma fonction qui recois le fichier:

void RecvSock(){
 ofstream f;
 f.open("c:\\p.jpg",ofstream::binary);
int i = recv(sock, buffer, sizeof(buffer), 0);
while(i>0){
i = recv(sock, buffer,sizeof(buffer), 0); 
f.write(buffer,i);
if(i<255){i=-1;}
}
f.close();
}

Je recois bien le fichier ,avec la bonne taille,avec un comparateur txt il est 100% identique a celuis sur le web.
Mais quand je l'execute il me dit fichier erronné.
Je voit pas d'ou vient l'erreur svp.
Merci a vous.

22 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Bon c'est le protocol HTTP que tu utilises, tu aurais pu le dire tout de suite.

Si tu fais une requette GET (sans option) la taille du fichier se
trouve dans le champ Content-Length de la réponse http. Normalement
elle est de la forme suivante: "Content-Length: 1234\r\n" ou 1234
represente la taille du fichier en octet.

Si le champ Content-Length n'est pas présent dans la réponse (c'est
rare mais ca peut arriver), alors la fin du fichier est marquée par la
fermeture de la connexion.


Jette un coup d'oeil dans la RFC HTTP, tu risque d'en avoir grandement besoin.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Faut revoir ta boucle, car:

- tu ne fais pas de write() pour ton 1er recv()

- si le recv() dans ta boucle échoue, tu fera quand meme le write() juste apres.

Et aussi, le "if(i<255){i=-1;}' ne me semble pas indispensable.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Salut.

J'ai rajouté:
if(i>0){
f.write(buffer,i);
}

Mais ca marche toujour  pas.

if(i<255){i=-1;}
sert pour la fin du fichier
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Moi je verrais plutot un truc de ce genre:

while((i = recv(...)) > 0)

{

    write(..., i, ...);

}


Le probleme de ton if(i<255){i=-1;} c'est que tu risque de sortir de ta boucle alors que le transfert n'est pas terminé.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Non par ce que je ne connais pas la taille du fichier,ca va rester en attente du socket avec cet methode.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Comment obtiens tu la taille du fichier, alors ?

Si la fin du transfert est marquée par la déconnection du socket, alors recv() retournera 0 ou -1 et on sortira de la boucle.

Le probleme avec ton code, c'est que tu suppose que si recv() retourne
un nombre plus petit de la taille du buffer, c'est que le transfert est
terminé. Alors que ce n'est pas vrai, en tcp, on ne doit pas supposer
que recv() retournera telle ou telle valeur. Par exemple, si ton
fichier fait 100 octets, peut etre que tu recevra les 100 octets en 1
recv(), ou peut etre que le premier recv() retournera seulement 50
octets, et donc il faudra que tu rapelles recv pour avoir la suite du
fichier.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Ah ok,j'ai cru que cela m'envoyer les donnees par tranche de 255 (la taille de mon buffer).


Sinon je sais pas comment avoir la taille du fichier.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

while((i = recv(sock, buffer,sizeof(buffer), 0))>0){

 Cela bloque bien a l'envois du dernier paquet
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Si ca bloque c'est que la connexion n'est pas fermée... faudrait voir le code.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Ca va j'ai note le taille du fichier et fais des boucles et ca marche.
Maitenent comment connaitre la taille du fichier avec une commande get ou quoi?.
Au cas ou je change de fichier.
Merci de ton aide.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Quelle commande get ?
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

genre :
send(sock,"GET SIZE www.site/image.jpg", 250)
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Maintenent mon pb c'est le debut du fichier .
Il m'envois des tage avec le debut du fichier image ,je fais comment?.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Sauf erreur, le debut du fichier se trouve apres la réponse HTTP, et celle ci se termine par la suite"\r\n\r\n".
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

y'a pas d'erreur c'est ça ;-)
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Sauf erreur HTTP je voulais dire :)

Si le code retourné est 404 par exemple, il est clair qu'il n'y aura rien apres la réponse.
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

Comme aardman l'a dit,tu n'a pas besoin de savoir cette taille .le recv()

retournera 0 ou -1 lorsque le transfert sera terminé .
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

lool desolé les amis ,j'ai pas vu qu'il y avait une deuxieme page .
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

pas tjs vrai taha, si la connection ne se ferme pas, recv reste bloquant ;-) enfin la soluce, c'est d'utiliser une commande qui permet d'attendre les données et une fois qu'on a confirmation qu'il y a des données dans le buffer, ben la on les lit. Sinon on attend le timeout que l'on a fixé (perso 10 secondes je pense que c'est suffisant, 0 octets en 10 sec ...)

Dans un élan de bontée, voila le code :
fd_set sockets;struct timeval waiting {TimeOut,0}; //TimeOut10
FD_ZERO(&sockets);
FD_SET(sock, &sockets); //sock représente ici votre socket

//dans la boucle de reception juste avant le recv
if(select(FD_SETSIZE, &sockets, NULL, NULL, &waiting)<=0)
    return false;

Et voila un moyen de faire une fonction de reception non bloquante
Messages postés
2
Date d'inscription
mardi 28 décembre 2010
Statut
Membre
Dernière intervention
4 janvier 2011

slt! tout le monde! est ce que vous pouvez m'aider un peu, je suis pas encore pro en VB. est ce que vous pouvez me donner la syntaxe la plus simple pour le transfert de fichier?
winsock1.senddata ....... que doi-je mettre là si je veux par exemple envoyer un fichier vidéo nommé video1.MPEG ?