Demande d'aide sur socket

Signaler
Messages postés
3
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
26 août 2008
-
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011
-
bonjour
 dans une partie de mon porjet je suis ramené à echanger des trames contenant ( taille,type,et contenue)
le problème ce que je ne sais pas comment je vais construire ma trame à l'envoi ni comment séparer chaque blocà la recéption, merci pour vôtre aide et vos liens utils

8 réponses

Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Ca parait simple, donc je me dits que j'ai mal compris le pb.

tu crées un bloc mémoire contenant toutes tes données puis tu les balances avec send ou sento.
Messages postés
3
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
26 août 2008

comment je vaus faire donc à la récéption??
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011

Salut,

Pour la réception tu lis les octets et tu cast dans le type que tu doit trouver.
Ou bien tu crées une structure contenant toutes les info de la réponse et
tu passes l'adresse de la structure au lieu de passer un buffer...

Moi je préfère passer une structure de buffer et faire un transtypage après
de chaque buffer (exemple pour réception udp de 3 octets):
dans le premier aotet le code d'erreur dans les deux suivant un entier sur deux octets:

  struct DEM{
    char rep;
    char alt[2];
    };
   DEM reponse;
   
   if ((Ret = recvfrom(ReceivingSocket, (char*)&reponse, sizeof(reponse), 0,
       (SOCKADDR *)&SenderAddr, &SenderAddrSize)) == SOCKET_ERROR)
   {
      printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError());
      closesocket(ReceivingSocket);
      WSACleanup();
      return 0;
   }

int octet1_bin1 = (reponse.alt[0] & 0x1)  >> 0;
int octet1_bin2 = (reponse.alt[0] & 0x2)  >> 1;
int octet1_bin3 = (reponse.alt[0] & 0x4)  >> 2;
int octet1_bin4 = (reponse.alt[0] & 0x8)  >> 3;
int octet1_bin5 = (reponse.alt[0] & 0x16) >> 4;
int octet1_bin6 = (reponse.alt[0] & 0x32) >> 5;
int octet1_bin7 = (reponse.alt[0] & 0x64) >> 6;
int octet1_bin8 = (reponse.alt[0] & 0x128)>> 7;

int octet2_bin1 = (reponse.alt[1] & 0x1)  >> 0;
int octet2_bin2 = (reponse.alt[1] & 0x2)  >> 1;
int octet2_bin3 = (reponse.alt[1] & 0x4)  >> 2;
int octet2_bin4 = (reponse.alt[1] & 0x8)  >> 3;
int octet2_bin5 = (reponse.alt[1] & 0x16) >> 4;
int octet2_bin6 = (reponse.alt[1] & 0x32) >> 5;
int octet2_bin7 = (reponse.alt[1] & 0x64) >> 6;
int octet2_bin8 = (reponse.alt[1] & 0x128)>> 8;

int Altitude;
Altitude = octet1_bin8  * 32768;
Altitude += octet1_bin7 * 16384;
Altitude += octet1_bin6 * 8192;
Altitude += octet1_bin5 * 4096;
Altitude += octet1_bin4 * 2048;
Altitude += octet1_bin3 * 1024;
Altitude += octet1_bin2 * 512;
Altitude += octet1_bin1 * 256;

Altitude += octet2_bin8 * 128;
Altitude += octet2_bin7 * 64;
Altitude += octet2_bin6 * 32;
Altitude += octet2_bin5 * 16;
Altitude += octet2_bin4 * 8;
Altitude += octet2_bin3 * 4;
Altitude += octet2_bin2 * 2;
Altitude += octet2_bin1 * 1;
closesocket(ReceivingSocket);
return Altitude;

Cordialement,
Sébastien.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
tu as une maniere bien compliquée de faire int Altitude = reponse.alt[0] << 8 | reponse.alt[1];
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011

Salut,

Effectivement, ma manière n'est pas des plus simples, mais elle a le mérite d'être explicite.
Ta méthode  est "La" méthode, chapeau l'artiste ! j'avais oublier le décalage à gauche,
faut dire que je n'en avais pas vu depuis quelques années...

Cordialement,
Sébastien.
Messages postés
3
Date d'inscription
jeudi 21 août 2008
Statut
Membre
Dernière intervention
26 août 2008

merci  sebastien mais je n'arrive pas à comprendre ta méthode aardman veut tu  m'expliquer ta methode?? merci
Messages postés
26
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
5 avril 2009

attention avec un recv d'une taille demandée la taille recue réellement peut etre plus petite
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011

Aarman fait un décalage a gauche de l'octet de poids fort et fait un ou logique avec l'octet de poids faible, il se retrouve avec l'entier codé sur deux octet.

Moi je décale tous les bit à droite pour faire un ET et savoir si il est à 0 ouo a 1...
ensuite je le multiplie par la valeur de chacun ( convertion base 2 base 10)

Cordialement,
Sébastien.