[Windows] Fonction socket : sendto(...)

Fonction socket : sendto(...) [Windows] - C++ - Programmation

Marsh Posté le 05-08-2003 à 16:18:55    

Voila (DarkLord :D), j'utilise la fonction sendto de VC++6 sous win98 pour envoyer des packets (via UDP) de prototype :
 
 
Code :
 
  int sendto (
    SOCKET s,                        
    const char FAR * buf,            
    int len,                          
    int flags,                        
    const struct sockaddr FAR * to,  
    int tolen                        
  );

 
 
 
Le bleme c que moi mon buffer (const char FAR * buf) qui pointe sur les donnees a envoyer, pointe sur un long. Ce sont bien des chiffres que je dois envoyer pas des char . Vous feriez comment ?


Message édité par Giz le 05-08-2003 à 16:21:27
Reply

Marsh Posté le 05-08-2003 à 16:18:55   

Reply

Marsh Posté le 05-08-2003 à 16:24:08    

bon j'ai trouve (ji pense jamais a ces fonctions de conversion  :sarcastic: ):
 
char *_ltoa( long value, char *string, int radix );
 
...mais mon buffer est un tableau du style :
long *buffer = new long [1000]
je dois donc faire 1000 iterations ? :/ je ne pe pas envoyer d'un coup l'& du tableau et la taille :/
En fait (juste pour savoir comment ca marche), ca me renvoie un tableau de 4 char et mon char * (passe en parametre) pointe sur la 1ere case. non ?


Message édité par Giz le 05-08-2003 à 16:28:14
Reply

Marsh Posté le 05-08-2003 à 16:27:43    

Bah tu convertis en string..
 
Ça doit être un truc comme ça sous VC6 :
CString str;
str.Format("%d", tonEntier);
sento(..str.c_str()..)

Reply

Marsh Posté le 05-08-2003 à 16:30:15    

*Syl* a écrit :

Bah tu convertis en string..
 
Ça doit être un truc comme ça sous VC6 :
CString str;
str.Format("%d", tonEntier);
sento(..str.c_str()..)


 
J'ai oublie de preciser mais c une appli dos. avec seulement des bon vieux <stdio.h> etc... dc CString je prefere pas utilise puis j'en ai pas besoin pour mon appli

Reply

Marsh Posté le 05-08-2003 à 16:50:16    

J'comprends pas là, tu parles de VC6 puis de DOS :heink:  
Si tu veux pas de CString, passe par la classe string de la STL et sors pas des vieilles fonctions C sur ce forum, Taz risquerait de piquer une crise :D

Reply

Marsh Posté le 05-08-2003 à 17:19:34    

sendto(...., (void*)buffer, ..) ca suffit, a toi de l autre cote de faire un. Les fonctions send/recv prenne un char* mais pas ds le sens chaine de caractere, mais buffer d'octet (le char etant generalement = 1 octet)
 

Code :
  1. long buffer[1000];
  2. int iReceived = recfrom(...., (void*)buffer, ...);

Reply

Marsh Posté le 05-08-2003 à 17:24:16    

VisualC++ a écrit :

le char etant generalement = 1 octet

Reply

Marsh Posté le 05-08-2003 à 17:27:21    

Reply

Marsh Posté le 05-08-2003 à 17:39:55    

Citation :

6.5.3.4 The sizeof operator
It is fundamental to the correct usage of functions such as malloc and fread that 15
sizeof(char) be exactly one. In practice, this means that a byte in C terms is the smallest unit
of storage, even if this unit is 36 bits wide; and all objects are composed of an integer number of
these smallest units.

?


Message édité par *syl* le 05-08-2003 à 17:40:53
Reply

Marsh Posté le 05-08-2003 à 17:40:08    

VisualC++ a écrit :

sendto(...., (void*)buffer, ..) ca suffit, a toi de l autre cote de faire un. Les fonctions send/recv prenne un char* mais pas ds le sens chaine de caractere, mais buffer d'octet (le char etant generalement = 1 octet)
 

Code :
  1. long buffer[1000];
  2. int iReceived = recfrom(...., (void*)buffer, ...);




alors leur char* dans le prototype n'est qu'un simple void*  :ouch:  
...t vraiment sur de ton coup ?? (pkoi ils disent char* c blairo ! void * c tellement plus simple  :sarcastic: )

Reply

Marsh Posté le 05-08-2003 à 17:40:08   

Reply

Marsh Posté le 05-08-2003 à 17:41:26    

*Syl* a écrit :

Citation :

6.5.3.4 The sizeof operator
It is fundamental to the correct usage of functions such as malloc and fread that 15
sizeof(char) be exactly one. In practice, this means that a byte in C terms is the smallest unit
of storage, even if this unit is 36 bits wide; and all objects are composed of an integer number of
these smallest units.



[:quoted]
 
maitenant relis

Reply

Marsh Posté le 05-08-2003 à 17:42:49    

Oui jsuis sur, le pkoi du char* plutot que void* doit etre historique mais aucune idee et franchement depuis le temsp je me pose mm plus la question, (void*)myBuffer tout le temps et c portable de partout.
 
Edit : par contre non char* c pas un typedef de void*


Message édité par VisualC++ le 05-08-2003 à 17:43:37
Reply

Marsh Posté le 05-08-2003 à 17:45:27    

C void*<->truc*
C++ truc*->void*
 
implicites

Reply

Marsh Posté le 05-08-2003 à 17:51:13    

Taz a écrit :

[:quoted]
 
maitenant relis

V'la comment j'traduis ça :

Citation :

C'est fondamental pour l'usage correct des fonctions telles que malloc et fread que sizeof(char) vaille 1. En pratique, ça signifie qu'un octet dans les termes du C est la plus petite unité de stockage, même si cette unité fais 36 bits; et que tous les objets sont composés d'un nombe entier de ces plus petites unités.

Ils disent bien que sizeof(char) == 1, après je pense que j'ai pas dû saisir leur histoire de 36 bits si tu me dis :non:

Reply

Marsh Posté le 05-08-2003 à 17:53:35    

re quoted...
 
byte ne doit pas etre traduit ou alors sous le terme multiplet. son sens est donné par la phrase -> plus petite unité adressable

Reply

Marsh Posté le 05-08-2003 à 18:01:34    

Ok, j'ai compris leur truc mais dans tous les cas sizeof(char) == 1 même si 1 char = 36 bits, j'me trompe ?

Reply

Marsh Posté le 05-08-2003 à 18:02:53    

oui. un char est codés sur CHAR_BIT
 
je me souviens plus mais sur un certain processeur, ça va jusqu'à 32 bits. apres de 10 et des 16 ça se trouve

Reply

Marsh Posté le 05-08-2003 à 18:04:26    

VisualC++ a écrit :

Oui jsuis sur, le pkoi du char* plutot que void* doit etre historique mais aucune idee et franchement depuis le temsp je me pose mm plus la question, (void*)myBuffer tout le temps et c portable de partout.
 
Edit : par contre non char* c pas un typedef de void*


 
erreur de contruction :
 

Code :
  1. d:\amap\sources\cnet_comm.cpp(83) : error C2440: 'type cast' : cannot convert from 'struct _DataBuffer' to 'void *'


 
t tjs sur de ton coup ?  :heink:  
 
mon code :
 

Code :
  1. DataBuffer buffer;
  2. sendto( sock,
  3. (void *) buffer,
  4. buffer.bufSize * sizeof(long),
  5. 0,
  6. (SOCKADDR*)&sock_in,
  7. sizeof(sock_in)
  8.       );


 
et sans le castage en void* j'ai le msg :
 

Code :
  1. d:\amap\sources\cnet_comm.cpp(89) : error C2664: 'sendto' : cannot convert parameter 2 from 'struct _DataBuffer' to 'const char *'



Message édité par Giz le 05-08-2003 à 18:06:13
Reply

Marsh Posté le 05-08-2003 à 18:04:53    

&

Reply

Marsh Posté le 05-08-2003 à 18:06:01    

tu as le droit de mettre (void*) & buffer :p
 
et oui jsuis toujours sur :D

Reply

Marsh Posté le 05-08-2003 à 18:06:16    

erf pas assez rapide

Reply

Marsh Posté le 05-08-2003 à 18:09:06    

VisualC++ a écrit :

tu as le droit de mettre (void*) & buffer :p
 
et oui jsuis toujours sur :D


desole pour ma betise (le & ) mais ca marche tjs pas  :(  

Code :
  1. sendto( sock,
  2. (void *)(&buffer),
  3. buffer.bufSize * sizeof(long),
  4. 0,
  5. (SOCKADDR*)&sock_in,
  6. sizeof(sock_in)
  7.       );


 
error :
 

Code :
  1. d:\amap\sources\cnet_comm.cpp(89) : error C2664: 'sendto' : cannot convert parameter 2 from 'void *' to 'const char *'

Reply

Marsh Posté le 05-08-2003 à 18:09:09    

Taz a écrit :

oui. un char est codés sur CHAR_BIT
 
je me souviens plus mais sur un certain processeur, ça va jusqu'à 32 bits. apres de 10 et des 16 ça se trouve

Ok, merci d'avoir éclairé ma lanterne :jap:

Reply

Marsh Posté le 05-08-2003 à 18:12:53    

giz a écrit :


desole pour ma betise (le & ) mais ca marche tjs pas  :(  

Code :
  1. sendto( sock,
  2. (void *)(&buffer),
  3. buffer.bufSize * sizeof(long),
  4. 0,
  5. (SOCKADDR*)&sock_in,
  6. sizeof(sock_in)
  7.       );


 
error :
 

Code :
  1. d:\amap\sources\cnet_comm.cpp(89) : error C2664: 'sendto' : cannot convert parameter 2 from 'void *' to 'const char *'




 
ben tu peux le forcer a faire un (char*)&buffer alors ca passera
 
Edit : et si tu dis que ca marche pas jete ton compilo ;) j ai un code sous les yeux avec (char*)&sSocket (sSocket etant une user def structure) et ca compile sans warning sous VS.Net sous XP et 2K, et sous gcc 3.2 et 3.3 sous Solaris.


Message édité par VisualC++ le 05-08-2003 à 18:16:49
Reply

Marsh Posté le 05-08-2003 à 18:24:48    

VisualC++ a écrit :


 
ben tu peux le forcer a faire un (char*)&buffer alors ca passera
 
Edit : et si tu dis que ca marche pas jete ton compilo ;) j ai un code sous les yeux avec (char*)&sSocket (sSocket etant une user def structure) et ca compile sans warning sous VS.Net sous XP et 2K, et sous gcc 3.2 et 3.3 sous Solaris.


 
Si ca marche...mais franchement je suis douteux de ton coup  :heink:  
 
Pour la taille du buffer a envoye, je specifie koi alors ?
buffer.bufSize * sizeof(long) pour indiquer la quantite de char a envoyer
- ou bien -
buffer.bufSize pour indiquer la quantite de long a envoyer.
 
PS : la fonction receive, recoit les donnee ds un buffer (tableau de char)...comment voudras tu que je recupere mon long moi ? :/
 
EDIT: faut bien s'appeler microsoft pour typer les donnees que l'on doit envoyer  :pfff: ... un void * ne genait en rien  :sarcastic:


Message édité par Giz le 05-08-2003 à 18:27:51
Reply

Marsh Posté le 05-08-2003 à 18:55:23    

C'est pour te prevenir que seul les "char" peuvent s'envoyer en reseau sans risque de compatibilité. Une histoire de big endian et de little endian.

Reply

Marsh Posté le 05-08-2003 à 19:02:06    

giz a écrit :


 
Si ca marche...mais franchement je suis douteux de ton coup  :heink:  
 
Pour la taille du buffer a envoye, je specifie koi alors ?
buffer.bufSize * sizeof(long) pour indiquer la quantite de char a envoyer
- ou bien -
buffer.bufSize pour indiquer la quantite de long a envoyer.
 
PS : la fonction receive, recoit les donnee ds un buffer (tableau de char)...comment voudras tu que je recupere mon long moi ? :/
 
EDIT: faut bien s'appeler microsoft pour typer les donnees que l'on doit envoyer  :pfff: ... un void * ne genait en rien  :sarcastic:  


 
T envoi la tailel en OCTET de ton buffer c tout.
 
Et sendto et consort c pas crosoft :p
 
Ben pour la reception de la mm maniere lol, recvfrom(...., (char*)&tontableudelong, ...)


Message édité par VisualC++ le 05-08-2003 à 19:03:00
Reply

Marsh Posté le 05-08-2003 à 19:33:06    

VisualC++ a écrit :

le char etant generalement = 1 octet


 
Pour info, je viens de me casser le cul 3 semaine à faire des Wrappeur d'api pour l'Unicode alors je peux t'assurrer que c'est vraiment pas toujours vrai ;-)

Reply

Marsh Posté le 05-08-2003 à 19:57:38    

j'ai presque envie de m'énerver tellement vous êtes gonflant avec votre compilo à 2 euros àlac..
 
ta réponse ça serait pas...
 
buffer.data, buffer.datasize*sizeof(long) ?
 
 
et arretez avec tous ces casts inutiles... la seule chose que fait un cast C, c'est une convertion binaire incoditionelle qqui revient à dire au compilo 'FERME TA GUEULE'  :o

Reply

Marsh Posté le 05-08-2003 à 21:16:22    

Kyle_Katarn a écrit :


 
Pour info, je viens de me casser le cul 3 semaine à faire des Wrappeur d'api pour l'Unicode alors je peux t'assurrer que c'est vraiment pas toujours vrai ;-)


 
J ai bien dit generalement (j ai le mm soucis entre 32 et 64 bits actuellement ;))  
 
Taz > pe ds l absolu jsuis d acc mais bon mm gcc geule donc tu sais les trucs "standard" c bien en theorie, en pratique c autre chose (enfin la il geule sous sunos pas sous windows)

Reply

Marsh Posté le 06-08-2003 à 11:16:58    

puis les fonctions generiques ne sont exploitables qu'avec des cast !...donc ca sert les cast

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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