[C] Transfert de fichier par sockets

bonobo78 Messages postés 9 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 29 octobre 2003 - 29 oct. 2003 à 18:26
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 - 29 oct. 2003 à 20:51
salut !

j'ai un petit pb pour transmettre un fichier via des sockets.
En fait, je decoupe le fichier en petit bout de 1024 octets et je transmets chaque bout par la socket. Mais comment s'arreter à la fin du fichier. Car ici, le dernier bout qui ne fait pas 1024 octets, contient la fin du fichier plus la fin du buffer du while précédant.

  FILE * File;
  char *message;
  int msg = ACK;
  int taille = 1024;

  File = fopen(path,"r");  
  message = (char*)malloc(1024);

   while((!feof(File))){
    
      fread(message,1024,1,File);
      if(write(sock,message,1024) == -1){
perror("EnvoieFichier2");
        exit(2);
      }
  }
  
  free(message);
  fclose(File);
  msg = FINFICHIER;
  printf("Fin de fichier\n");
  if(write(sock, &msg, sizeof(msg)) == -1){
     perror("FinEnvoi");
     exit(2);
  }

15 réponses

Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 18:31
tu sauvegarde la valeur de retour de fread et tu remplace ton 1024 avec

size_t n = fread(message,1024,1,File);
if(write(sock,message,n) == -1){

ca devré etre bon
0
bonobo78 Messages postés 9 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 29 octobre 2003
29 oct. 2003 à 18:57
fread renvoie 0 ou 1 en fonction si il arrive a lire ou pas la taille (1024).

et ca m'oblige d'envoyer la taille au client ! c embettant :(
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:02
"fread returns the number of full items actually read"
donc pas 0 ou 1

En fait, tu t'es trompé dans l'ordre des param :
ce n'est pas : fread(message,1024,1,File);
mais : fread(message,1,1024,File);

et la ca te renvéra le bon nombre
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:08
"et ca m'oblige d'envoyer la taille au client ! c embettant :( "
-> de tte facon, je crois que tu est obligé d'envoyer la taille totale du fichier

parceque quand il recevra les données, il fera ca dans une boucle while, mais cette boucle ne peut pas savoir quand s'arété sauf si tu lui a passé d'abord la taille du fichier qu'elle comparera avec ce qu'elle a reçu

ou alors il y a une autre technique que je ne connais pas
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
29 oct. 2003 à 19:13
Salut,
Si tu recois un buffer qui contient moins de 1024 octets tu peut interpreter ca comme la fin du fichier et sortir de ta boucle. Mais bon je pense aussi qu'envoyer la taille du fichier est le plus sur.
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:16
ah oui tien, j'avais pas pensé a ça, mais en imaginant qu'il y a un petit pb de connection ou de ralentissement, il ne recevra pas le packet en entier et pfiou ! le fichier sera foutu.
Comme tu le dit, je pense aussi qu'envoyer la taile est plus sur
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:21
au fait, puisqu'on est en plin dans les socket, j'en profite pour te demandé un petit conseil aardman, toi qui t'y connais très bien sur ce sujet :

quand on envoyer plusieur petit paquet rapidemment, le serveur peut les "recoller", et ca, de tps en tps, ca m'embète un peu puisque je fait un strncmp() sur le début de la chaine
Y a-t-il un moyen d'empécher ce regroupement ?
0
bonobo78 Messages postés 9 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 29 octobre 2003
29 oct. 2003 à 19:23
comment on fait un printf d'un size_t ?
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:26
un size_t c 'est à peu de chose près comme un int, donc tu fait un %d (met un cast si le compilo n'aime pas ca)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 oct. 2003 à 19:31
Salut,
Honnetement je peut pas te repondre précisement, j'ai jamais fait ca. En TCP, le serveur lis dans son buffer tout ce qu'il peut lire, donc je pense qu'en mettant un buffer d'envoi de la meme taille de le buffer de reception, il n'y aura pas de probleme.
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:43
Justement, je ne peut pas conaitre à l'avance la taille du buffer que je recevrai (d'ou le strncmp qui ne compare que le début)

Enfin c'est pas très grave, j'arrive a faire avec en générale, merci quand même ;)
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 19:48
ah nan, scuse, j'ai parler trop vite et j'avais mal compris ce que tu voulais dire !
je peut quand même envoyer la fin du buffer (même si je ne l'utiliserai pas) et du coup ca tombera juste, merci !
0
cs_JCpp Messages postés 334 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 3 juillet 2010
29 oct. 2003 à 20:43
Moi aussi, j'envoi la taille au client ou serveur au début du transfère.
Ça fonctionne bien, j'ai testé pour 12Mo.

Ci non, connais tu un moyen de connaître la taille d’un répertoire ou du lecteur c:\ par exemple, pour un fichier c’est GetFileSize ?

Merci
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 oct. 2003 à 20:48
Salut,
Poste un message dans le forum général pour que tlm le vois, moi j'en ai aucune idée.
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
29 oct. 2003 à 20:51
GetFileSize peut marcher pour un fichier mais ca dépant de la façon dont tu l'ouvre, il faut utilisé du win32 donc CreateFile

Pour la taille du dossier, tu pourrait utilisé FindFirstFile et FindNextFile mais je suppose qu'il y a un moyen bien plus pratique, seulement la je ne le connais pas désolé
0
Rejoignez-nous