Fonction socket : sendto(...) [Windows] - C++ - Programmation
Marsh Posté le 05-08-2003 à 16:24:08
bon j'ai trouve (ji pense jamais a ces fonctions de conversion   ):
 ): 
 
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
 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 ?
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()..)
Marsh Posté le 05-08-2003 à 16:30:15
| *Syl* a écrit : Bah tu convertis en string..  | 
 
 
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
Marsh Posté le 05-08-2003 à 16:50:16
J'comprends pas là, tu parles de VC6 puis de DOS  
  
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 
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 : 
 | 
Marsh Posté le 05-08-2003 à 17:39:55
| Citation : 6.5.3.4 The sizeof operator  | 
?
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)  
   | 
 
alors leur char* dans le prototype n'est qu'un simple void*   
  
...t vraiment sur de ton coup ?? (pkoi ils disent char* c blairo ! void * c tellement plus simple   )
 )
Marsh Posté le 05-08-2003 à 17:41:26
| *Syl* a écrit : 
   | 
![[:quoted] [:quoted]](https://forum-images.hardware.fr/images/perso/quoted.gif) 
 
 
maitenant relis
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*
Marsh Posté le 05-08-2003 à 17:51:13
| Taz a écrit : 
 | 
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 
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
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 ?
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
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.  | 
 
 
erreur de contruction : 
 
| Code : 
 | 
 
 
t tjs sur de ton coup ?   
  
 
mon code : 
 
| Code : 
 | 
 
 
et sans le castage en void* j'ai le msg : 
 
| Code : 
 | 
 
Marsh Posté le 05-08-2003 à 18:06:01
tu as le droit de mettre (void*) & buffer  
 
 
et oui jsuis toujours sur 
Marsh Posté le 05-08-2003 à 18:09:06
| VisualC++ a écrit : tu as le droit de mettre (void*) & buffer  | 
 
desole pour ma betise (le & ) mais ca marche tjs pas   
  
| Code : 
 | 
 
 
error : 
 
| Code : 
 | 
Marsh Posté le 05-08-2003 à 18:09:09
| Taz a écrit : oui. un char est codés sur CHAR_BIT  | 
Ok, merci d'avoir éclairé ma lanterne  
 
Marsh Posté le 05-08-2003 à 18:12:53
| giz 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.
 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.
Marsh Posté le 05-08-2003 à 18:24:48
| VisualC++ a écrit :   | 
 
 
Si ca marche...mais franchement je suis douteux de ton coup   
  
 
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   ... un void * ne genait en rien
 ... un void * ne genait en rien   
 
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. 
Marsh Posté le 05-08-2003 à 19:02:06
| giz a écrit :   | 
 
 
T envoi la tailel en OCTET de ton buffer c tout. 
 
Et sendto et consort c pas crosoft  
 
 
Ben pour la reception de la mm maniere lol, recvfrom(...., (char*)&tontableudelong, ...)
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 ;-)
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'   
 
Marsh Posté le 05-08-2003 à 21:16:22
| Kyle_Katarn a écrit :   | 
 
 
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)
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
Marsh Posté le 05-08-2003 à 16:18:55
Voila (DarkLord ), j'utilise la fonction sendto de VC++6 sous win98 pour envoyer des packets (via UDP) de prototype :
), 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