Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme pour un protocole de communication

12 réponses
Avatar
francois
Bonjour,

j'ai besoin d'envoyer des données sous vb6 avec winsock d'un pc à un autre
en respectant un protocole défini.

Et je suis un peu perdu pour respecter les tailles des données binaires à
envoyer.

J'ai bien pensé créer un type personnalisé, mais je bloque completement.

Voila ce que dit le protocole.

Il y a 2 types. Le type integer qui fait un octet. Et le type chaine qui a
une taille indéfini de caracteres ascii et qui fini par un NULL.

Le paquet que je dois envoyer par tcp/ip se présente par exemple sous la
forme suivante :

1er champ :
Integer taille : 4 octets taille du paquet
2e champ :
Integer taille : 4 octets type de commande
3e champ :
chaine nom de commande
4e champ :
Integer taille : 6 octets type d'argument
5e champ :
chaine nom d'argument
6e champ :
Integer taille : 1 octet instruction

Dans le paquet que je dois envoyer, le champ taille correspond à la taille
total du paquet.

Pour le type de commande, j'ai 28

Pour le nom de commande j'ai "TEST"

Pour le type d'argument j'ai 155

Pour le nom d'argument j'ai "ARGUMENT TEST"

pour le champ instruction j'ai 5

Quelqu'un sait où je pourrais trouver une aide pour coder cela de facon à ce
que mon windosck.SendData puisse envoyer le paquet en respectant bien les
tailles des champs binaires ( qui font 4 ou 6 octets et donc en remplissant
avec des 0 ) ?

Merci pour votre aide, ca me rendra vraiment beaucoup service.

10 réponses

1 2
Avatar
François Picalausa
Hello,

Sous VB les Integer font 2 octets, les Long en font 4.
Donc, pour envoyer une commande sur 4 octets, tu peux employer quelquechose
comme:
Dim Blah As Long
Blah = &h1C '28
Winsock.SendData Blah

Il est aussi possible de définir implicitement le type de donénes:
Winsock.SendData &H1C&

Pour envoyer une chaine de caractères à la suite, tu peux initier un nouveau
SendData:
Winsock.SendData &H1C&
Winsock.SendData "TEST" & vbNullChar

Pour des integer de 6 octets, par contre, ça se corse... il n'y a pas ce
genre de types prédéfinis.
Néanmoins, 6 = 2 + 4 (ordre important) et donc, un peu de convertion et deux
SendData (un Integer suivit d'un Long ou l'inverse, suivant la procédure de
convertion) peuvent fonctionner.

--
François Picalausa

"francois" a écrit dans le message de news:

Bonjour,

j'ai besoin d'envoyer des données sous vb6 avec winsock d'un pc à un
autre en respectant un protocole défini.

Et je suis un peu perdu pour respecter les tailles des données
binaires à envoyer.

J'ai bien pensé créer un type personnalisé, mais je bloque
completement.
Voila ce que dit le protocole.

Il y a 2 types. Le type integer qui fait un octet. Et le type chaine
qui a une taille indéfini de caracteres ascii et qui fini par un NULL.

Le paquet que je dois envoyer par tcp/ip se présente par exemple sous
la forme suivante :

1er champ :
Integer taille : 4 octets taille du paquet
2e champ :
Integer taille : 4 octets type de commande
3e champ :
chaine nom de commande
4e champ :
Integer taille : 6 octets type d'argument
5e champ :
chaine nom d'argument
6e champ :
Integer taille : 1 octet instruction

Dans le paquet que je dois envoyer, le champ taille correspond à la
taille total du paquet.

Pour le type de commande, j'ai 28

Pour le nom de commande j'ai "TEST"

Pour le type d'argument j'ai 155

Pour le nom d'argument j'ai "ARGUMENT TEST"

pour le champ instruction j'ai 5

Quelqu'un sait où je pourrais trouver une aide pour coder cela de
facon à ce que mon windosck.SendData puisse envoyer le paquet en
respectant bien les tailles des champs binaires ( qui font 4 ou 6
octets et donc en remplissant avec des 0 ) ?

Merci pour votre aide, ca me rendra vraiment beaucoup service.


Avatar
francois
"François Picalausa" a écrit dans le message de news:

Hello,

Sous VB les Integer font 2 octets, les Long en font 4.
Donc, pour envoyer une commande sur 4 octets, tu peux employer
quelquechose comme:
Dim Blah As Long
Blah = &h1C '28
Winsock.SendData Blah




Bonjour,

C'est un apostrophe que vous avez mis entre 1C et 28 ? Pourquoi ?

Donc, si j'envoye un Long avec SendData, il partira forcément sur 4 octet
même si la valeur est inférieur à 255 ?

Merci de votre réponse.
Avatar
Jacques
Bonsoir,
francois a écrit :
"François Picalausa" a écrit dans le message de news:


Hello,

Sous VB les Integer font 2 octets, les Long en font 4.
Donc, pour envoyer une commande sur 4 octets, tu peux employer
quelquechose comme:
Dim Blah As Long
Blah = &h1C '28
Winsock.SendData Blah





Bonjour,

C'est un apostrophe que vous avez mis entre 1C et 28 ? Pourquoi ?



' (apostrophe) indique le début d'un commentaire

&h1C : &h indique une valeur hexadécimale. 1C en hexa = 28 en décimal


Donc, si j'envoye un Long avec SendData, il partira forcément sur 4 octet
même si la valeur est inférieur à 255 ?



Oui.

Dans ton cas, pour tout ce qui n'est pas chaine de caractères tu devrait
peut être utiliser :

Dim Blah as string

Blah = chr$(28) ' pour un octet
Blah = chr$(x) & chr$(y) ' pour 2 octets
' (x et y étant les valeurs à envoyer)
etc ...
--
Cordialement,

Jacques.
Avatar
François Picalausa
Hello,

En VB l'apostrophe désigne un commentaire.
J'ai de cette manière noté à côté du nombre hexadécimal sa valeur
décimale... Ceci simplement parce que l'on perçoit généralement mieux la
taille d'une donnée en hexadécimal...

Sion, oui, un Long de VB fait 4 octets et fera toujours 4 octets, qu'il soit
en mémoire, ou qu'ilpasse par winsock ou qu'il soit stoqué dans un fichier
ou ...
La valeur importe peu, c'est le type qui définit la taille.

--
François Picalausa

"francois" a écrit dans le message de news:

"François Picalausa" a écrit dans le message de
news:
Hello,

Sous VB les Integer font 2 octets, les Long en font 4.
Donc, pour envoyer une commande sur 4 octets, tu peux employer
quelquechose comme:
Dim Blah As Long
Blah = &h1C '28
Winsock.SendData Blah




Bonjour,

C'est un apostrophe que vous avez mis entre 1C et 28 ? Pourquoi ?

Donc, si j'envoye un Long avec SendData, il partira forcément sur 4
octet même si la valeur est inférieur à 255 ?

Merci de votre réponse.


Avatar
francois
"François Picalausa" a écrit dans le message de news:
OdGK7$
Hello,

En VB l'apostrophe désigne un commentaire.
J'ai de cette manière noté à côté du nombre hexadécimal sa valeur
décimale... Ceci simplement parce que l'on perçoit généralement mieux la
taille d'une donnée en hexadécimal...

Sion, oui, un Long de VB fait 4 octets et fera toujours 4 octets, qu'il
soit en mémoire, ou qu'ilpasse par winsock ou qu'il soit stoqué dans un
fichier ou ...
La valeur importe peu, c'est le type qui définit la taille.




Bonjour,

je viens de tester cela :

Dim chaine As String
Dim test As Long

test = 45
chaine = Chr(test)
SmppSendPrime.SendData chaine

et il renvoit uniquement un octet et pas 4.

d'ailleurs c'est confirmé puisque si je fais un len(chaine) il me renvoye
un.

Avez vous une solution ?

Je bloque complétement.

merci à tous.
Avatar
francois
"francois" a écrit dans le message de news:


"François Picalausa" a écrit dans le message de
news: OdGK7$
Hello,

En VB l'apostrophe désigne un commentaire.
J'ai de cette manière noté à côté du nombre hexadécimal sa valeur
décimale... Ceci simplement parce que l'on perçoit généralement mieux la
taille d'une donnée en hexadécimal...

Sion, oui, un Long de VB fait 4 octets et fera toujours 4 octets, qu'il
soit en mémoire, ou qu'ilpasse par winsock ou qu'il soit stoqué dans un
fichier ou ...
La valeur importe peu, c'est le type qui définit la taille.




Bonjour,

je viens de tester cela :

Dim chaine As String
Dim test As Long

test = 45
chaine = Chr(test)
SmppSendPrime.SendData chaine

et il renvoit uniquement un octet et pas 4.

d'ailleurs c'est confirmé puisque si je fais un len(chaine) il me renvoye
un.

Avez vous une solution ?

Je bloque complétement.

merci à tous.



J'ai essayé Chr(CLng(test)) ca ne change rien il envoye toujours sur 1
octets.

j'ai essayé CLng(Chr(test)) il me renvoye type incompatible.
Avatar
Jacques
Bonsoir,
francois a écrit :
"François Picalausa" a écrit dans le message de news:
OdGK7$

Hello,

En VB l'apostrophe désigne un commentaire.
J'ai de cette manière noté à côté du nombre hexadécimal sa valeur
décimale... Ceci simplement parce que l'on perçoit généralement mieux la
taille d'une donnée en hexadécimal...

Sion, oui, un Long de VB fait 4 octets et fera toujours 4 octets, qu'il
soit en mémoire, ou qu'ilpasse par winsock ou qu'il soit stoqué dans un
fichier ou ...
La valeur importe peu, c'est le type qui définit la taille.





Bonjour,

je viens de tester cela :

Dim chaine As String
Dim test As Long

test = 45
chaine = Chr(test)
SmppSendPrime.SendData chaine

et il renvoit uniquement un octet et pas 4.




Chr$() renvoie un octet (8 bits).

Si tu veux envoyer 4 caractères :

chaine = chr$(Test) & chr$(0) & chr$(0) & chr$(0)

Ensuite cela dépend aussi de l'ordre dans lequel le programme récepteur
interprete les données :

Pour Intel, avec un entier de type Long (32 bits)

Low-Word (16 bits) / High-Word (16 bits)

et à l'intérieur de chaque mots de 16 bits

Low-Byte (8 bits) / High Byte (8 bits)

c'est à dire que la valeur hexa 0x12 34 56 78 sera stockée sous la forme
0x78 0x56 0x34 0x12 .

Notation dite little Endian.


--
Cordialement,

Jacques.
Avatar
Jean-Marc
"francois" a écrit dans le message de
news:

> Dim chaine As String
> Dim test As Long
>
> test = 45
> chaine = Chr(test)
> SmppSendPrime.SendData chaine
>
> et il renvoit uniquement un octet et pas 4.
>
> d'ailleurs c'est confirmé puisque si je fais un len(chaine) il me


renvoye
> un.



On croit rêver. Vous m'envoyez chier sur un autre groupe
de discussion en me disant que "Oui, concatener des
chaînes, je sais faire" ...

Lisez la doc de Chr() et Chr$() au lieu de faire des
"essais" débiles :-((

Allez, je suis pas rancunier:

Dim s as String

s = chr(0) & chr(0) & chr(0) & chr(45)

debug.print len(s) ' <= Oh joie! Ca fait 4 !

winsock.senddata s ' <= taddaa!! miracle, ça marche!

<hs action="conseil">
si vous voulez de l'aide, être grossier
n'est pas le meilleur moyen.
</hs>

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
francois
"Jean-Marc" a écrit dans le message de
news: 4249c4c0$0$30160$
"francois" a écrit dans le message de
news:

> Dim chaine As String
> Dim test As Long
>
> test = 45
> chaine = Chr(test)
> SmppSendPrime.SendData chaine
>
> et il renvoit uniquement un octet et pas 4.
>
> d'ailleurs c'est confirmé puisque si je fais un len(chaine) il me


renvoye
> un.



On croit rêver. Vous m'envoyez chier sur un autre groupe
de discussion en me disant que "Oui, concatener des
chaînes, je sais faire" ...

Lisez la doc de Chr() et Chr$() au lieu de faire des
"essais" débiles :-((

Allez, je suis pas rancunier:

Dim s as String

s = chr(0) & chr(0) & chr(0) & chr(45)




je vous remercie de votre aide.

je veux pas être grossier et je m'en excuse sincerement si j'ai donné
l'impression de l'avoir été..

Mais là aussi (comme dans vos messages dans l'autre forum), ce que vous
proposez, je peux le faire sans probleme et j'y avais déjà pensé.

Mais je vous rappelle que le nombre à envoyer est un long. Et si le nombre à
envoyer est 300 et que je tape

s = chr(0) & chr(0) & chr(0) & chr(300)

Ca ne marchera pas.

Donc, sans être grossier (et j'espere sincerement que vous ne prendrez pas
mal ma réponse car ce n'est pas le but et je vous suis reconnaissant d'avoir
essayé de faire avance le chmilblick), votre solution ne me sert strictement
à rien.

Ce que j'aimerais, ce serait une solution qui marche à tous les coups et pas
uniquement dans certains cas très particuliers....
Avatar
francois
"Jacques" a écrit dans le message de
news:
Bonsoir,
francois a écrit :
"François Picalausa" a écrit dans le message de
news: OdGK7$

Hello,

En VB l'apostrophe désigne un commentaire.
J'ai de cette manière noté à côté du nombre hexadécimal sa valeur
décimale... Ceci simplement parce que l'on perçoit généralement mieux la
taille d'une donnée en hexadécimal...

Sion, oui, un Long de VB fait 4 octets et fera toujours 4 octets, qu'il
soit en mémoire, ou qu'ilpasse par winsock ou qu'il soit stoqué dans un
fichier ou ...
La valeur importe peu, c'est le type qui définit la taille.





Bonjour,

je viens de tester cela :

Dim chaine As String
Dim test As Long

test = 45
chaine = Chr(test)
SmppSendPrime.SendData chaine

et il renvoit uniquement un octet et pas 4.




Chr$() renvoie un octet (8 bits).

Si tu veux envoyer 4 caractères :

chaine = chr$(Test) & chr$(0) & chr$(0) & chr$(0)




Merci de votre réponse.

Dans mon cas c'est du Big Endian. Donc ce serait
chaine = chr$(0) & chr$(0) & chr$(0) & chr$(Test)

Mais comme je l'ai dit à une autre personne, cette solution ne me convient
pas puisque Test est un Long.

Et que si Test = 300, ca ne fonctionne pas.

En fait, si quelqu'un me donne les calculs (ca devient trop complique pour
moi :):) ) me permettant de remplir le s 3 premiers chr$ si test est
superieur à 255... je pourrais me débrouiller :)

merci de votre aide.
1 2