Transfert de fichiers

Signaler
Messages postés
6
Date d'inscription
lundi 25 novembre 2002
Statut
Membre
Dernière intervention
22 septembre 2003
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
Salut a tous,

J aurai besoin d aide pour continuer un projet de chat,
le probleme c est que je n arrive pas a transferer correctement les fichiers, pour les fichiers text ca va, mais pour les exe, zip, rar, je n y arrive pas...


 f = fopen(path, "rb");
  if(!f)
   {
    sprintf(sendbuf,"Invalid file path\r\n");
    send(s,sendbuf,strlen(sendbuf),0);
    return 0;
   }

  fseek(f, 0,SEEK_END);
  fsize = ftell(f);
  fseek(f,0,SEEK_SET);

  while (sent < fsize)
  {
    left = fsize - sent;    if (left < 600) max left; else max 600;
    fread(datas, sizeof(char), max, f);
    send(s, datas, max, 0);
    sent += max;
  } 

  fclose(f);
  return 1;
}



Merci de m indiquer si ya des erreurs ou si c est pas la bonne methode.
Happy Coding =)

++kyo;

9 réponses

Messages postés
5
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
17 octobre 2007

> f = fopen(path, "rb");
> if(!f)
> {
> sprintf(sendbuf,"Invalid file path\r\n");
> send(s,sendbuf,strlen(sendbuf),0);
> return 0;
> }
>
> fseek(f, 0,SEEK_END);
> fsize = ftell(f);
> fseek(f,0,SEEK_SET);
>
> while (sent < fsize)
> {
> left = fsize - sent;> if (left < 600) max left; else max 600;
> fread(datas, sizeof(char), max, f);
> send(s, datas, max, 0);
> sent += max;
> }
>
> fclose(f);
> return 1;

Franchement g pas trop analyser ton code surtout que y'a des variable on c pas comment elles sont déclarées, moi je fais un truc dans ce genre :

f = fopen(path, "rb");
if (f!=NULL)
{
fseek(f, 0,SEEK_END);
fsize = ftell(f);
fseek(f,0,SEEK_SET);

int taillefic=fsize/8; //j'enverrai le fichier 8 octet par 8 octet
int tailleReste=fsize%8; // cela me donne le reste car mon fichier n'est pas forcement un multiple de 8

for(int cpt=0;cpt<taillefic;cpt+8)
{
fread(datas, 1,8, f); //je lis 8 octet de mon buffer
send(s, datas, 8, 0);//je les envoi
}

// on n'a plus que le reste a envoyer
fread(datas, 1,tailleReste, f);
send(s, datas, tailleReste, 0);

Voila tu peux diviser par un autre chiffre si tu veux ou bien envoyer ton fichier octet par octet en faisant while(!eof) mais ma methode est tres bien quand meme...voila @+
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
c'est le strlen sur un buffer qui contient du binaire qui cloche. Il est evident qu'il rencontre un zero nimporte ou.
strlen est reserve aux chaines terminees par un zero.
BruNews, ciao...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Moi je serais plutot tenté d'envoyer des paquets de 1ko ou 2ko a la fois plutot que par petit paquet de 8 octets.
Messages postés
6
Date d'inscription
lundi 25 novembre 2002
Statut
Membre
Dernière intervention
22 septembre 2003

Merci pour les reponses,
au fait il n y a pas de strlen() sur un buffer en binaire..
Et j ai reussi avec ta methode senseiwushu merci!
J imagine aussi qu avec des fichiers de grande taille, y vaudrait mieux envoyer 1024 par 1024 octets pour la rapidité,
en tout cas merci pour vos conseils!
a++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Le strlen() sur le buffer en binaire c'est a la ligne:

send(s,sendbuf,strlen(sendbuf),0);

Ca marche pour un txt, mais pour exe, zip, rar, sendbuf contiendra du binaire, et donc ne fonctionne pas.
Messages postés
6
Date d'inscription
lundi 25 novembre 2002
Statut
Membre
Dernière intervention
22 septembre 2003

Ah celui la! ben si tu regarde bien, ce buffer ne contient qu un message d erreur.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Exact!
J'avais mal vu.
Messages postés
5
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
17 octobre 2007

derien, c tjrs un plaisir d'aider :)
effectivement tu peux aussi envoyer par 1024 mais la taille d'une trame ne peux dépasser un certain poids (je ne sais plus la limite) donc après un certain seuil de dépassé les couches réseau se chargeront de fragmenter tes données en plusieurs petit morceau ce qui revient au meme que si tu avait mis une petite taille des le début (d'ailleurs je trouvais ca super rapide deja avec 8 octets, tu n'auras qu'a tester si tu as le temps)

voila @++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Si tu envoies des gros buffer, il sera fragmentés en plusieurs envois, chaqu'un de taille maximale (et encore je pense que la limite est superieure a 1ko).
Je pense que ca sera toujours mieux que par petits bouts de 8 octets.
Imagine le cas ou chaque bout de 8 octets est envoyé dans un paquet different...
Enfin, c'etait juste un avis.