prob de transfert sur socket TCP

prob de transfert sur socket TCP - C - Programmation

Marsh Posté le 21-05-2004 à 14:26:06    

Salut. voilà le prob:
 
j'ai deux pc en réseau et je crée un tableau dynamique constitué de chaines de caractères sur chacun d'eux:
 
char* **table;
 
sur un poste j'initialise le tableau avec des chaines et je voudrais transmettre ce tableau sur l'autre pc ou mon tableau "table" est resté vide. Pour ca j'utilise les socket. Sur le pc ou la table est mise à jour je fait un:
 
write(sock, &(**table), sizeof(char* **));
 
et sur l'autre pc je fais un:
 
read(sock_com, &(**table), sizeof(char* **));
 
Voilà, la seule chose dont je suis sur c que la connexion est bien faite  entre les deux pc et que l'écriture sur la socket se passe correctement.
Maintenant à la réception, quand je lis ma table, je m'apercois qu'elle est toujours vide (en gros elle n'a pas été écrasée par celle que j'ai recue).
 
Pourquoi et comment remédier à ca? je pense que celà peut venir du fait que la table est doublement pointée.
 
merci pour votre aide

Reply

Marsh Posté le 21-05-2004 à 14:26:06   

Reply

Marsh Posté le 21-05-2004 à 15:04:50    

Je pense que tout ton programme est faux (ton truc du triple pointeur, ça m'étonne). Il faudrait que tu montres tout le source (enfin, les parties intéressantes comme l'initialisation de ton tableau), mais en tout cas, sur ce que tu montres, le sizeof(char***) est completement faux.  
 
printf("%d\n", sizeof(char***)); -> ça donne 4
 
Bref, prend un bouquin de C et apprend!

Reply

Marsh Posté le 21-05-2004 à 15:22:49    

ok bah voilà un bout du code avec la création et l'initialisation du tableau:
(cependant le coup du [char* **] je l'ai trouvé sur ce forum)
 
 

Code :
  1. void creer_table()
  2. {
  3.   int i;
  4.  
  5.   table = malloc(nb_anneaux*sizeof(char **));
  6.   for(i=0; i<nb_anneaux; i++)
  7.     table[i] = malloc(nb_machines_max*sizeof(char *));
  8. }
  9. void initialiser_table()
  10. {
  11.   int i;
  12.  
  13.   for(i=0; i<nb_anneaux; i++)
  14.     {
  15.       table[i][0] = NULL;
  16.     }
  17. }
  18. int main{
  19. char* **table;
  20. creer_table();
  21. initialiser_table();
  22. .
  23. .
  24. .
  25. }

Reply

Marsh Posté le 21-05-2004 à 16:44:51    

je trouve nul part de solution pour mon probleme
please aidez moi

Reply

Marsh Posté le 21-05-2004 à 17:20:55    

C'est portnawak le char ***table, si tu veux faire un tableau de chaine c'est char **table.
Après pour l'allocation c'est un truc du style:
 

Code :
  1. table=(char**)malloc(nb_anneaux*sizeof(char *));
  2. for(i=0;i<nb_anneaux;i++) table[i]=(char *)malloc(nb_machines_max*sizeof(char));


 
/edit: Ha j'avais pas vu ton autre topic... visiblement tu vas avoir des soucis a faire fonctionner ton truc tant que tu n'auras pas capté ce qu'est un pointeur. En plus dans ton read/write tu copie des adresses, ce qui visiblement n'est pas le but recherché.


Message édité par merlin-boa le 21-05-2004 à 17:25:30
Reply

Marsh Posté le 22-05-2004 à 01:05:47    

le probleme c'est ke tu passes tout le tableau en param a write et et hop!
deja ton tableau est mauvais c'est char **table
ensuite lorsque tu passes en param a write la taille d'octets a ecrire doit etre fausse!
essai plutot d'envoyer les chaines une a une

Code :
  1. for(i = 0; i < nbDeChaines; i++)
  2. write(fdSock, table[i], strlen(tab[i]));


Message édité par Rits75 le 22-05-2004 à 01:08:16
Reply

Marsh Posté le 26-05-2004 à 11:01:54    

T'envois l'adresse du tableau en fait (ton erreur est au niveau du sizeof()). C'est pour ca que ton client retrouve rien. Faut eviter d'envoyer les pointer a double dimension par les sockets (je dis ca, mais c'est p'etre jouable de les envoyer, pour ca faudrai que tu connaisse la taille total de ton tableau et la ca serai peut etre jouable, si tu arrive dis le moi). je vote pour le for aussi. et utilise strlen() comme la dit ritz.

Reply

Marsh Posté le 26-05-2004 à 19:29:04    

oops une erreur de post


Message édité par Deaddy le 26-05-2004 à 19:36:09
Reply

Sujets relatifs:

Leave a Replay

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