compatibilité GMP / socket

compatibilité GMP / socket - C - Programmation

Marsh Posté le 16-07-2013 à 12:28:00    

Bonjour,
j'utilise la bibliothéque GMP, j'ai defini une structure (je doit envoyer des valeurs de variable avec les socket):  

Code :
  1. struct variabletype
  2. {
  3.   char nom;
  4.   mpz_t valeur;
  5.   };


 
je defini mes socket correctement,  bref il n'y a pas de probléme au niveau de mes sockets ,  
 
j'ai crée ces deux fonction :  
 

Code :
  1. void send2 (SOCKET sock,struct variabletype variable)
  2. {
  3. if(send(sock,&variable,sizeof(variable),0)!=SOCKET_ERROR)   
  4.     printf(" envoi effectuer %c \n",variable.nom);
  5.    else
  6.      perror("envoi" );
  7. }
  8. void recv2 (SOCKET sock,mpz_t * var ,char cvar)
  9. {
  10.   struct variabletype variable;
  11. mpz_init(variable.valeur);
  12. if(recv(sock,&variable,sizeof(variable),0)!= SOCKET_ERROR)
  13.   {
  14. printf(" recu: %c :: \n",variable.nom);
  15. gmp_printf("variable.valeur= %Zd \n",variable.valeur);
  16.     if(variable.nom == cvar)
  17.     {
  18.  mpz_init_set(* var,variable.valeur);
  19.     }
  20.     else
  21.       printf("probleme d'envoie\n" );
  22.   }
  23.   else
  24.  perror("recv" );
  25. }


 
les programmes qui discutent utilisent ces deux fonctions :  
tous est correctement initialisé et compile mais il y a une segementation fault au niveau  du "gmp_printf " de recv2. Je l'ai donc mis en commentaire pour voir et la segementation fault apparait cette fois si au " mpz_init_set(* var,variable.valeur) ;" . j'en ai donc déduit qu'il y a un probléme au niveau de recv et send ?  
quelqu'un a t'il déja rancontré ce probléme ?  
note: aucune erreur de send et de recv n'est a observer puisque le "printf(" recu: %c :: \n",variable.nom);" affiche le bon caractére. De plus j'ai le même programe qui tourne avec des int plutôt qu'avec GMP (je me suis entrainé avec les entier avans d'utiliser gmp.h. et il marche trés bien (mais les int ne sont pas assez gros pour se que je veux faire.

Reply

Marsh Posté le 16-07-2013 à 12:28:00   

Reply

Marsh Posté le 16-07-2013 à 14:41:37    

Bonjour !
 
Je soupçonne que le mpz_t soit un type "opaque", et ne soit rien d'autre qu'un pointeur sur une structure connue uniquement par les fonctions internes de la lib.
 
Dans ce cas-là, il est tout à fait normal que vous ayez une seg. fault, car le processeur qui reçoit le message tente d'accéder à de la mémoire qui appartient à un autre processus (si l'émetteur est sur la même machine) ou une adresse qui est alloué sur une autre machine et qui ne correspond donc à rien sur la machine du receveur.  
 
Pour faire fonctionner le tout, il vous faut une sorte de sérialisation, qui est sans doute fournie par la bibliothèque.
 
Bonne continuation !

Reply

Sujets relatifs:

Leave a Replay

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