Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1186 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Envoyer un message après le send d'une fichier via socket

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Envoyer un message après le send d'une fichier via socket

n°2330886
hb2012
Posté le 26-03-2019 à 09:04:24  profilanswer
 

Bonjour,
J'ai fait un programme qui fait le transfert d'une fichier JSON en utilisant socket du client vers le serveur. En fait, je voulais envoyer un message après le recevoir du fichier du serveur vers le client mais apparemment il y a une problème qui cloche, donc le message n'arrive pas au client. Pouvez-vous m'aider SVP. Voici les codes sources:
 
server.c:

Code :
  1. #include <ctype.h>
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include <json-c/json.h>
  5. #include <netinet/in.h>
  6. #include <pthread.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <stdarg.h>
  11. #include <sys/mman.h>
  12. #include <sys/stat.h>
  13. #include <sys/socket.h>
  14. #include <unistd.h>
  15. #include "jsmn.h"
  16. #define BUFFER_SIZE          1024
  17. #define MARGE_PROGRESSION     100
  18. #define BUFFER_SIZE_JSON   100000
  19. #define MAX_TOKEN_COUNT       128
  20. pthread_t        th_server;
  21. pthread_cond_t   cond_sr;
  22. pthread_mutex_t  verrou_sr;
  23. /***********************************************************************
  24. * Main.c:  
  25. **********************************************************************/
  26. int main(int argc, char *argv[])
  27. {
  28.   FILE* fichier_sr;
  29.   int   socket         = 0;
  30.   int   size_line, desc_write;
  31.   long  fichier_size   = 0, size_avanc_sr = 0;
  32.   char* fichier_sr_nom = "server_test.json";
  33.   char* line_buf       = (char *) malloc (BUFFER_SIZE*sizeof(char));
  34.   char* Msg_to_cl      = (char* )malloc(BUFFER_SIZE*sizeof(char)); 
  35.         Msg_to_cl      = "hello from server\n"; 
  36.   pthread_mutex_init (&verrou_sr, NULL);
  37.   pthread_cond_init (&cond_sr, NULL);
  38.   fichier_sr   = fopen(fichier_sr_nom,"w" );
  39.   socket       = attente (socket, argv[1]);
  40.   fichier_size = lire_taille_fich(socket, fichier_size); 
  41.   pthread_create(&th_server,NULL,thread_pourcentage_server,NULL);
  42.   while((size_line = recevoir_fichier(size_line,socket, line_buf)) >= 0)
  43.   {
  44.     if (size_line == 0)
  45. {
  46.   break;
  47. }
  48. desc_write = ecrire_fichier(desc_write,size_line,fichier_sr,line_buf);
  49. size_avanc_sr += size_line;
  50. pthread_mutex_lock(&verrou_sr);
  51. result_server=100*((float)(size_avanc_sr)/(float)(fichier_size));
  52. pthread_mutex_unlock(&verrou_sr);
  53. pthread_cond_broadcast(&cond_sr);
  54.     usleep(100000);
  55. if (desc_write < size_line)
  56. {
  57.   perror("File write failed on server.\n" );
  58. }
  59.   }
  60.   pthread_join(th_server, NULL); 
  61.   pthread_mutex_destroy (&verrou_sr);
  62.   pthread_cond_destroy (&cond_sr);
  63.   fclose(fichier_sr);
  64.   //parseJSON(fichier_sr_nom);
  65.   send(socket,Msg_to_cl,BUFFER_SIZE,0);
  66.   return 0;
  67. }


 
client.c

Code :
  1. #include <arpa/inet.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <stdlib.h>
  6. #include <netinet/in.h>
  7. #include <string.h>
  8. #include <sys/stat.h>
  9. #include <pthread.h>
  10. #define BUFFER_SIZE      1024
  11. #define MARGE_PROGRESSION 100
  12. pthread_t        th_client;
  13. pthread_cond_t   cond_cl;
  14. pthread_mutex_t  verrou_cl;
  15. /***********************************************************************
  16. * Main.c:  
  17. **********************************************************************/
  18. int main(int argc, char *argv[])
  19.   FILE*    fichier_cl;
  20.   int      socket = 0;
  21.   long     size_file     = 0, size_avanc_cl = 0;
  22.   char*    line_str      = NULL;
  23.   char*    file_name     = "client_file.json";
  24.   char*    Msg_from_sr   = (char* )malloc(BUFFER_SIZE*sizeof(char));           
  25.   size_t   line_pos      = 0;
  26.   ssize_t  desc_line;
  27.   pthread_mutex_init (&verrou_cl, NULL);
  28.   pthread_cond_init (&cond_cl, NULL);
  29.   fichier_cl = fopen(file_name,"r" );
  30.   size_file  = taille_fich(file_name);
  31.   socket     = connecte(socket,argv[1],argv[2]);
  32.   socket     = envoyer_taille_fich(socket,size_file);
  33.   pthread_create(&th_client,NULL,thread_pourcentage_client,NULL);
  34.   while ((desc_line = getline(&line_str, &line_pos, fichier_cl)) != -1)
  35.   {
  36.     if((socket = envoyer_fich(socket,line_str)) < 0)
  37. {
  38.   printf("ERROR: Failed to send file %s.\n", file_name);
  39.   break;
  40. }
  41. size_avanc_cl += strlen(line_str);
  42. pthread_mutex_lock(&verrou_cl);
  43. result_thread=100*((float)(size_avanc_cl)/(float)(size_file));
  44. pthread_mutex_unlock(&verrou_cl);
  45. pthread_cond_broadcast(&cond_cl);
  46.     //usleep(100000);
  47.     if (line_str)
  48.     {
  49.     free(line_str);
  50.     }
  51.     line_pos = 0; 
  52.   }
  53.   pthread_join(th_client, NULL); 
  54.   pthread_mutex_destroy (&verrou_cl);
  55.   pthread_cond_destroy (&cond_cl);
  56.   fclose(fichier_cl);
  57.   read(socket, Msg_from_sr, 100);
  58.   return 0;
  59. }


 
Merci d'avance

mood
Publicité
Posté le 26-03-2019 à 09:04:24  profilanswer
 

n°2330912
xilebo
noone
Posté le 26-03-2019 à 17:01:20  profilanswer
 

Bonjour,  
 
Le code est incomplet, difficile de faire une analyse sans les fonctions :  
 
attente
lire_taille_fich
recevoir_fichier
ecrire_fichier
 
etc.
 
Par ailleurs, utiliser les threads pour afficher un pourcentage d'avancement sur la console est surprenant.

n°2331117
hb2012
Posté le 01-04-2019 à 12:48:38  profilanswer
 

Merci "xilebo" mais apparemment j'ai résolu mon problème en utilisant un autre port de connexion entre le serveur et le client pour la reste du partie interactive entre les deux


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Envoyer un message après le send d'une fichier via socket

 

Sujets relatifs
Décalage dans un fichier txtEncodage d'un fichier jpeg via Ajax
Fichier XML / Base de donnéeJe veux envoyer un email avec PHP
liste des feuilles d'un fichier excelComment Modifier le contenu d'un fichier txt chaque jour par csv
Programmation de Socket sous androidoccurrenc d'un mot dans un fichier
Fichier JSON to stringNotification sur smartphone quand un fichier sur PC est modifié
Plus de sujets relatifs à : Envoyer un message après le send d'une fichier via socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR