Transfert de fichiers

OnimenoKyo Messages postés 6 Date d'inscription lundi 25 novembre 2002 Statut Membre Dernière intervention 22 septembre 2003 - 15 sept. 2003 à 00:48
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 16 sept. 2003 à 07:44
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

senseiwushu Messages postés 5 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 17 octobre 2007
15 sept. 2003 à 01:58
> 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 @+
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 sept. 2003 à 08:55
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...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 sept. 2003 à 10:30
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.
0
OnimenoKyo Messages postés 6 Date d'inscription lundi 25 novembre 2002 Statut Membre Dernière intervention 22 septembre 2003
15 sept. 2003 à 17:20
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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 sept. 2003 à 18:02
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.
0
OnimenoKyo Messages postés 6 Date d'inscription lundi 25 novembre 2002 Statut Membre Dernière intervention 22 septembre 2003
15 sept. 2003 à 18:11
Ah celui la! ben si tu regarde bien, ce buffer ne contient qu un message d erreur.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 sept. 2003 à 18:22
Exact!
J'avais mal vu.
0
senseiwushu Messages postés 5 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 17 octobre 2007
16 sept. 2003 à 03:05
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 @++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
16 sept. 2003 à 07:44
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.
0
Rejoignez-nous