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

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

Marsh Posté le 26-03-2019 à 09:04:24    

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

Reply

Marsh Posté le 26-03-2019 à 09:04:24   

Reply

Marsh Posté le 26-03-2019 à 17:01:20    

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.

Reply

Marsh Posté le 01-04-2019 à 12:48:38    

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

Reply

Sujets relatifs:

Leave a Replay

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