Récupération du nom de fichier

Récupération du nom de fichier - C - Programmation

Marsh Posté le 07-05-2006 à 19:03:51    

Bonjour,
 
J'ai un client qui se connecte à mon serveur pour lui transférer un fichier texte.
Voici un extrait du code client lors du transfert du fichier:
 

Code :
  1. tmp = getenv ("COMPUTERNAME" );
  2. sprintf (chemin, "config_%s.txt",tmp);
  3. fichier = fopen(chemin,"r" ); //Ouverture en lecture seule en mode txt
  4.         if(fichier == NULL) { // verification de l'ouverture correcte du fichier
  5.         printf("Erreur lors l'ouverture du fichier\n" );
  6.         exit(-1); // Sortir avec le code erreur -1
  7.                             }
  8. fseek(fichier,0,SEEK_END ); // Placement du pointeur en fin de fichier
  9. size=ftell(fichier); // Recuperation dans la variable taille de la position du pointeur (donne la tailel du fichier)
  10. fseek(fichier,0,SEEK_SET);  // Placement du pointeur en debut de fichier
  11. fread(buffer,65535,1,fichier); // Lecture du fichier
  12. nb_caracteres = send(sock,buffer,size,0); //Envoi des donnees
  13. fclose (fichier); // Fermeture du fichier
  14. if (nb_caracteres==SOCKET_ERROR) { // Test du nombre de caractères
  15.         printf("Transfert du fichier impossible, erreur : %d\n",WSAGetLastError()); // Affichage du code erreur


 
J'aimerais que mon serveur récupère exactement le même nom de fichier que le client lui aura transféré.
Je pensais créer une variable "nomfichier" dans mon code serveur dans laquelle je stockerais "chemin" issu du client, mais je ne vois pas comment faire.
 
Ca fonctionne bien si je précise manuellement le chemin dans mon code serveur, mais j'aimerais pouvoir faire

Code :
  1. fichier = fopen(nomfichier,"w" )

avec nomfichier = chemin

Reply

Marsh Posté le 07-05-2006 à 19:03:51   

Reply

Marsh Posté le 07-05-2006 à 19:13:22    

#
fread(buffer,65535,1,fichier); // Lecture du fichier
 
et si size > 65535 ?
 
 
la solution à ton problème : transférer le nom du fichier, c'est tout.

Reply

Marsh Posté le 07-05-2006 à 20:41:24    

Donc l'utilisation des fonctions recv() et send() suffit?

Reply

Marsh Posté le 07-05-2006 à 21:52:40    

bien sur.

Reply

Marsh Posté le 07-05-2006 à 21:53:35    

si ton OS le permet, tu peux aussi utiliser sendfile pour transférer des fichiers.

Reply

Marsh Posté le 08-05-2006 à 01:52:44    

Merci  :jap:  

Reply

Marsh Posté le 08-05-2006 à 11:59:51    

lynxia a écrit :

Code :
  1. fread(buffer,65535,1,fichier); // Lecture du fichier
  2. nb_caracteres = send(sock,buffer,size,0); //Envoi des donnees




 
Comme l'a dit Taz, si jamais ton fichier fait plus de 65535 octets, tu ne le récupèreras pas en entier. En plus, il me semble que "fread" travaille en signé donc il s'arrête à 32767 (c'est à vérifier). Bon, de toute façon, quelle que soit la limite t'es coincée si ton fichier la dépasse
Il faut que ton client fasse une boucle de lecture et d'envoi sur la socket

Code :
  1. while ((nbLu=fread(buffer, 1, N, fichier)) > 0)
  2.       send(sock, buffer, nbLu, 0);


 
Et que ton serveur fasse une boucle de réception de la socket et d'écriture

Code :
  1. while ((nbLu=recv(sock, buffer, N, 0)) > 0)
  2.       fwrite(buffer, 1, nbLu, fichier);


Le "N" étant une constante pouvant être définie à la valeur que tu veux (de 1 à 65535)
 
Quand au nom du fichier, il sera évidemment transmis en tout premier sur le serveur...


Message édité par Sve@r le 08-05-2006 à 12:00:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-05-2006 à 12:19:06    

Citation :

En plus, il me semble que "fread" travaille en signé donc il s'arrête à 32767 (c'est à vérifier)

size_t est non signé. et même sur une machine 16bits, tu peux lire avec fread 2**32 octets.


Message édité par Taz le 08-05-2006 à 12:19:33
Reply

Marsh Posté le 08-05-2006 à 17:46:04    

Merci à vous :)
 
Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?

Reply

Marsh Posté le 08-05-2006 à 17:54:11    

lynxia a écrit :

Merci à vous :)
 
Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?


doit être < à la taille de buffer ...


Message édité par Emmanuel Delahaye le 08-05-2006 à 17:54:59

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-05-2006 à 17:54:11   

Reply

Marsh Posté le 08-05-2006 à 20:48:40    

lynxia a écrit :

Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?


 
C'est juste une constante qui donne le nb d'octets que tu liras à chaque boucle
Tu la définis comme tu veux (ex: #define N          1000) mais elle influera sur la mémoire et le temps d'exécution de la boucle.
 
Si elle est définie à 1, tu lis le fichier octet par octet et tu écris sur la socket octet par octet. C'est long mais ça ne consomme pas de mémoire.
Si elle est définie à 65535, ta boucle utilise 65535 fois plus de mémoire mais fait 65535 fois moins d'itérations.
Ensuite, c'est une question de compromis qui dépend souvent de la machine qui exécute ton pgm...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-05-2006 à 20:50:27    

Ok merci je comprends mieux :)

Reply

Marsh Posté le 08-05-2006 à 20:53:11    

lynxia a écrit :

Ok merci je comprends mieux :)


Bien entendu, il te faut aussi définir ton buffer ainsi

Code :
  1. char buffer[N];

Message cité 1 fois
Message édité par Sve@r le 08-05-2006 à 20:54:11

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-05-2006 à 23:31:50    

Sve@r a écrit :

Bien entendu, il te faut aussi définir ton buffer ainsi

Code :
  1. char buffer[N];



 
Vi :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed