[ C, C++] SOCKET : format des donnees envoyees avec fonction send()

SOCKET : format des donnees envoyees avec fonction send() [ C, C++] - C++ - Programmation

Marsh Posté le 30-10-2002 à 16:43:44    

Question :
 
avec la fonction send() j'ai l'impression que le seul type de donnee que je peux envoyer sont soit des caracteres ASCII ou des char (de 0 a 127) ? Or je voudrais envoyer des unsigned char, est ce qu'il y a une solution ?
 
 :(


Message édité par Le_Chab le 30-10-2002 à 18:03:19
Reply

Marsh Posté le 30-10-2002 à 16:43:44   

Reply

Marsh Posté le 30-10-2002 à 18:07:21    

Citation :


est-il possible d'envoyer autre chose que du char* via la fonction send  


 
  L'argument de la fonction send est un char*, mais en fait
il faut plutôt le comprendre comme du void*.
  Send n'en a rien à faire que tu envoies des éléments de
tel ou tel type. Il lui faut juste la taille de ce qu'il
y a à envoyer et l'addresse mémoire ou c'est placé.
  Tu peux donc faire un send sur n'importe quoi, il faut
juste caster en char* pour le compilateur.
 
  Une question que je me pose, c'est pourquoi ils ont mis
des char* ? (je sais juste que c'est une veille habitude
en C, mais pas plus)
 
  Dernierement, un petit conseil : évite de mettre des tonnes
de ligne de code sur le forum : c'est inutile, illisible et
surtout ça donne la désagréable impression d'un "tenez  
démerdez-vous avec ça"

Reply

Marsh Posté le 30-10-2002 à 18:09:09    

mince, pas cool de changes ton texte quand je tape une
réponse... :-)

Reply

Marsh Posté le 30-10-2002 à 18:19:44    

pascal_ a écrit a écrit :

Citation :


est-il possible d'envoyer autre chose que du char* via la fonction send  


 
  L'argument de la fonction send est un char*, mais en fait
il faut plutôt le comprendre comme du void*.
  Send n'en a rien à faire que tu envoies des éléments de
tel ou tel type. Il lui faut juste la taille de ce qu'il
y a à envoyer et l'addresse mémoire ou c'est placé.
  Tu peux donc faire un send sur n'importe quoi, il faut
juste caster en char* pour le compilateur.
 
 



 
 
OK j'essaie ca !
 
 
je suis daccord avec le fait que trop de code c'est penible, raison pour laquelle je l'ai enleve  :)  :)

Reply

Marsh Posté le 31-10-2002 à 10:31:12    

bon apres essai de ta methode ca ne marche pas mieux ... la j'en suis a envoyer mes donnees sous forme de char* et je les caste sous forme d'unsigned char a l'arrivee, la ca marche....  
 
j'ai cependant un  autre soucis, dans le flux de donnee que je voudrai envoyer, je voudrai envoyer egalement du texte,  
 
un truc du genre "01f124ac4557erreur dans procedure proc"
 
quelqu'un aurait une solution pour ca ???  

Reply

Marsh Posté le 31-10-2002 à 11:10:31    

Le_Chab a écrit a écrit :

j'ai cependant un  autre soucis, dans le flux de donnee que je voudrai envoyer, je voudrai envoyer egalement du texte,  
 
un truc du genre "01f124ac4557erreur dans procedure proc"
 
quelqu'un aurait une solution pour ca ???  
 




 
Ben faut que tu definisses un format pour tes donnees echangees.
Exemple:
 
- 1 octet: type a definir par toi meme.
- 1 int: longueur des donnees
- N octets: donnees
 
Apres si tu veux envoyer le texte "coucou" (supposons que tu as une classe de socket):
 

Code :
  1. const char *txt = "coucou";
  2. char type = MSG_TEXT;
  3. socket.send(&type, sizeof(type));
  4. int len = strlen(txt);
  5. socket.send(&len, sizeof(len));
  6. socket.send(txt, len);
  7. pour recevoir, c'est symetrique.
  8. char type = 0;
  9. int len;
  10. // a faire: verifier qu'on a recu 1, 4 et N octets
  11. socket.recv(&type, sizeof(type));
  12. socket.recv(&len, sizeof(len));
  13. char *pbuff = new char[len+1];
  14. socket.recv(pbuff, len);
  15. pbuff[len] = '\0';
  16. std::cout << "On nous a dit: << pbuff << std::endl;

Reply

Marsh Posté le 31-10-2002 à 11:16:37    

Attention tout de même, dans le cas où tu échanges des données entre 2 machines différentes : toutes ne codent pas les entiers de la même façon.
Si tu envoies l'entier sur 4 octets 0x00000001, tu risques de recevoir 0x01000000.
Regarde les fonction htonl, ntohl, htons, ntohs.
 
Il n'y a pas ce problème pour les caractères où les entiers sur 1 octet.

Reply

Marsh Posté le 31-10-2002 à 11:34:39    

je regarde tout ca ! merci a tous !

Reply

Sujets relatifs:

Leave a Replay

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