OVH Cloud OVH Cloud

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.

2 réponses

1 2
Avatar
Jean-Marc
"francois" a écrit dans le message de
news:

"Jacques" a écrit dans le message de
news:
> Bonsoir,
> francois a écrit :
>> "François Picalausa" a écrit dans le message de
>> news: OdGK7$
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 :)



Hello,
bon voiciç ta fonction. Le principe est simple:
tu passes à la fonction ton nombre (long) et le nombre d'octets
souhaités pour la chaine résultat.
la fonction fait ceci:
- elle convertit en hexa avec hex$() parce que s'est plus simple à manipuler
- elle complète à gauche avec des 0 pour aligner sur le nombre souhiaté
d'octets
- puis, et c'est la l'astuce, elle convertit chaque sous chaine de 2
caractères hexa
en 1 entierr (1 octet) et construit la sortie par concaténation.

voici un exemple d'appel:
Dim nb As Long
Dim sRet As String
Dim errStatus As Integer
Dim nb_octets As Integer

' exemple, mettre 45879 sur 4 octets
nb = 45879
nb_octets = 4

sRet = hexa_n(nb, nb_octets, errStatus)
If errStatus = 0 Then ' tout va bien
MsgBox "ok, sRet contient nb en hexa sur " & nb_octets
Else
MsgBox "quelque chose s'est mall passé, sans doute " & nb_octets & "
trop petit pour " & nb
End If

Et voici la fonction générique qui fait cela:


Private Function hexa_n(ByVal nb As Long, ByVal size As Integer, ByRef
errStatus As Integer) As String
Dim s As String
Dim i As Integer
Dim res As String

' 1) on convertit en hexadécimal, c'est plus pratique
s = Hex$(nb)
' 2) on met tout ça sur size*2 positions
' par exemple si on veut 4 octets, on met sur 8 positions
' en paddant à gauche avec des 0

' si le nombre d'octets demandé est trop petit pour le nombre,
' erreur
If Len(s) > (size * 2) Then
errStatus = 1
Else
' on padde à gauche avec des 0
For i = 1 To (size * 2) - Len(s)
s = "0" & s
Next i
' 3) on découpe par blocs de 2 en partant de la gauche
For i = 1 To Len(s) - 1 Step 2
res = res & Chr("&h" & Mid$(s, i, 2))
Next i
End If
hexa_n = res
End Function

Si la ce n'est pas ce que tu souhaites, alors je n'ai rien compris
et je laisse ma place au suivant :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Jacques
Bonjour,
francois a écrit :
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.



En reprenant les valeurs du post d'origine :

Private Sub Command1_Click()
Dim s As String

s = Long2StrBE(28)
s = s & "TEST" & Chr$(0)
s = s & Long2StrBE(155, 6)
s = s & "ARGUMENT TEST" & Chr$(0)
s = s & Long2StrBE(5, 1)
s = Long2StrBE(Len(s)) & s

Debug.Print Len(s) & " : " & s

End Sub

Private Function Long2StrBE(ByVal l As Long, Optional length As Integer
= 4) As String
Dim p As Long, R As Long, d As Long
Dim s As String

For p = 32 To 0 Step -8
If p = 32 Then
R = 2 ^ (p - 1) - 1
Else
R = 2 ^ p
End If
If l > R Then
d = l R
l = l - (R * d)
s = s & Chr$(d)
End If
Next p

While Len(s) < length
s = Chr$(0) & s
Wend
Long2StrBE = s

'For p = 1 To Len(s)
' Debug.Print Format(Hex(Asc(Mid(s, p, 1))), "0#") & " ";
'Next p
'Debug.Print
End Function

--
Cordialement,

Jacques.
1 2