Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2848 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°478296
Giz
Posté le 05-08-2003 à 16:18:55  profilanswer
 

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
mood
Publicité
Posté le 05-08-2003 à 16:18:55  profilanswer
 

n°478314
Giz
Posté le 05-08-2003 à 16:24:08  profilanswer
 

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
n°478319
*syl*
--> []
Posté le 05-08-2003 à 16:27:43  profilanswer
 

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

n°478326
Giz
Posté le 05-08-2003 à 16:30:15  profilanswer
 

*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

n°478393
*syl*
--&gt; []
Posté le 05-08-2003 à 16:50:16  profilanswer
 

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

n°478436
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 17:19:34  profilanswer
 

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, ...);

n°478439
*syl*
--&gt; []
Posté le 05-08-2003 à 17:24:16  profilanswer
 

VisualC++ a écrit :

le char etant generalement = 1 octet

n°478441
Taz
bisounours-codeur
Posté le 05-08-2003 à 17:27:21  profilanswer
 
n°478449
*syl*
--&gt; []
Posté le 05-08-2003 à 17:39:55  profilanswer
 

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
n°478450
Giz
Posté le 05-08-2003 à 17:40:08  profilanswer
 

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: )

mood
Publicité
Posté le 05-08-2003 à 17:40:08  profilanswer
 

n°478453
Taz
bisounours-codeur
Posté le 05-08-2003 à 17:41:26  profilanswer
 

*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

n°478454
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 17:42:49  profilanswer
 

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
n°478461
Taz
bisounours-codeur
Posté le 05-08-2003 à 17:45:27  profilanswer
 

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

n°478468
*syl*
--&gt; []
Posté le 05-08-2003 à 17:51:13  profilanswer
 

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:

n°478472
Taz
bisounours-codeur
Posté le 05-08-2003 à 17:53:35  profilanswer
 

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

n°478486
*syl*
--&gt; []
Posté le 05-08-2003 à 18:01:34  profilanswer
 

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

n°478488
Taz
bisounours-codeur
Posté le 05-08-2003 à 18:02:53  profilanswer
 

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

n°478490
Giz
Posté le 05-08-2003 à 18:04:26  profilanswer
 

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
n°478491
Taz
bisounours-codeur
Posté le 05-08-2003 à 18:04:53  profilanswer
 

&

n°478492
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 18:06:01  profilanswer
 

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

n°478493
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 18:06:16  profilanswer
 

erf pas assez rapide

n°478499
Giz
Posté le 05-08-2003 à 18:09:06  profilanswer
 

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 *'

n°478500
*syl*
--&gt; []
Posté le 05-08-2003 à 18:09:09  profilanswer
 

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:

n°478503
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 18:12:53  profilanswer
 

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
n°478511
Giz
Posté le 05-08-2003 à 18:24:48  profilanswer
 

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
n°478519
Kristoph
Posté le 05-08-2003 à 18:55:23  profilanswer
 

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.

n°478523
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 19:02:06  profilanswer
 

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
n°478537
Kyle_Katar​n
The World Is A Vampire ....
Posté le 05-08-2003 à 19:33:06  profilanswer
 

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 ;-)


---------------
KC Softwares - VideoInspector (Codec Viewer) - AudioGrail
n°478545
Taz
bisounours-codeur
Posté le 05-08-2003 à 19:57:38  profilanswer
 

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

n°478577
VisualC++
J'va y penser ...
Posté le 05-08-2003 à 21:16:22  profilanswer
 

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)

n°478886
Giz
Posté le 06-08-2003 à 11:16:58  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[divers] débutant en programmation WINDOWS[Windows] connaître le taux d'UpLoad global actuel
PHP, socket & telnet... se logger sur un serveur distant [SOLVED][Résolu] formulaire => données envoyés à fonction php ?
probleme avec les themes de windows :-/ | progressbar & ownerdrawHELP, pb avec fonction if
[Windows] recuperer la date sous la forme jj-mm-aaaaCréer un lien dans XSL en fonction de données dans XML
probleme de fonctionRéférence à une fonction d'une autre classe
Plus de sujets relatifs à : [Windows] Fonction socket : sendto(...)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR