VB/VB.Net 2 id dans 1 packet ?

Inscrit
28 Mars 2015
Messages
38
Reactions
0
#1
Bonjour,

je rencontre un problème assez ennuyeux :

Il se trouve que dans 1 packets, j'obtiens 2 ID, ce qui fait que mon programme ne cherche plus à analyser les packets suivants :



Je pense que le problème vient de la classe parsing :

Code:
Public Shared Waiting As Integer
    Public Shared Data_Out() As Byte
    Public Shared Data() As Byte
    Public Shared Launched As Boolean

    Private NoPacket As Integer = Nothing

    Public Sub parsing(ByVal data() As Byte, ByVal NoPacket As Integer)
        If (data.Length > 2) Then
            Me.NoPacket = NoPacket
            Try
                Dim index As Integer ' pour savoir ou on est
                Dim id_and_length As UShort ' les 2 premiers octets (16 bits)
                Dim packet_id As UShort ' les 14 premiers bits des 16
                Dim packet_length_of As Byte ' les 2 derniers bits des 16
                Dim packet_length As Integer ' la longueur du packet
                Dim Packet_Start As Integer
                Dim Packet_End As Integer


                If Waiting > 1 Then ' le buffer etait trop petit ?
                    Dim data_temps(data.Length + Data_Out.Length - 1) As Byte ' on créé un tableau de byte temporaire
                    Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length) ' on met le debut du paquet trop long dans le tableau temporaire
                    Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length) ' on met la reception a la suite
                    data = data_temps ' on met le tableau temporaire dans le tableau de travail
                End If

                Do Until index = data.Length ' on traite jusque la fin
                    Packet_Start = index
                    id_and_length = data(index) * 256 + data(index + 1) ' les 2 premiers octets
                    packet_length_of = id_and_length And 3 ' on veut les 2 derniers bits donc on masque (and) avec 11 en binaire (3 en decimal)
                    packet_id = id_and_length >> 2 ' on veut les 14 premiers bits donc on decale les 16 bits de 2 bits vers la droite
                    index += 2 + packet_length_of  ' on avance des 2 octets de id_and_length + du nombre d'octets de la taille de taille

                    Select Case packet_length_of ' on lit le bon nombre d'octet pour connaitre la taille des données
                        Case 0
                            packet_length = 0
                        Case 1
                            packet_length = data(index - 1)
                        Case 2
                            packet_length = 256 * data(index - 2) + data(index - 1)
                        Case 3
                            packet_length = 65536 * data(index - 3) + 256 * data(index - 2) + data(index - 1)
                    End Select

                    If index + packet_length > data.Length Then ' buffer trop petit ?
                        Waiting = packet_length + index - Packet_Start ' alors on le signale
                        ReDim Data_Out(data.Length - Packet_Start - 1) ' on redimensionne le tableau de debut du paquet trop long
                        Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start) ' on copie le debut du paquet trop long
                        Exit Sub ' on sort
                    End If

                    Dim packet(0) As Byte ' on prepare le paquet
                    If packet_length > 0 Then ' si sa taille est plus grande que 0 on redimensionne
                        ReDim packet(packet_length - 1)
                        Array.Copy(data, index, packet, 0, packet_length) ' et on copie les donnée
                    End If

                    DataCheck(packet_id, New Dofus.DofusReader(New IO.MemoryStream(packet))) ' on verra plus tard
                    index += packet_length ' on met l'index a jour
                    Packet_End = index
                    If Packet_End = data.Length Then ' si ca tombe pile poil alors le buffer etait assez grand
                        Waiting = 0 ' on reset
                        ReDim Data_Out(0) ' on reset
                    End If
                Loop

            Catch e As Exception
                F_listePacketID.L_packet.Items.Add(NoPacket)
                F_listePacketID.L_id.Items.Add("NaN")
                F_listePacketID.L_exception.Items.Add(e.Message)
            End Try
        End If

    End Sub
Merci de votre aide :)
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#2
Oui c'est possible, enfin du moins c'est plutôt les packets (au send Dofuck) qui sont dans le même packet réseau, c'est à toi de gérer cette possibilité. Tu peux t'inspirer de certaines classes dans des projets open-sources qui sont sur le forum :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#3
#ShadowBot #RaidBot #BiM #EuuBot
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#4
J'ai essayé de laisser du suspens, t'as tout cassé :'(
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#5
#Miskine
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#6
y'a aussi le cas inverse mais plus rare , un seul message a cheval sur 2 paquets , ca c'est un peu plus chiant a gerer , normalement ce parseur marche tres bien
 
Inscrit
28 Mars 2015
Messages
38
Reactions
0
#7
effectivement 1 message sur 2 packet ... sa doit être casse c*uille

Merci je vais voir si je trouve quelque chose dans les sources

Il me semble bien aussi mais après c'est peut être moi qui est mal codé quelque part d'autre, même surement ;)

______________

EDIT : je pense avoir trouvé, j'ai remarqué que ces double numéro correspond au traitement de packet UDP, alors qu'il n'apparait pas l'ip de dofus ni en source ni destinataire, mais une ip du genre "192.168..." donc je pense que je vais filtrer et je n'aurais déjà plus ce problème

EDIT 2 : Problème réglé c'est bon de ce côté, tous mes packets sont lus normalement :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
J'utilisais ce parser sans souci à l'époque. Tu met les datas comme tu les recois.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#9
En effet, Dofus n'utilise que des paquets TCP. Quand on m'écoute pas alors que je conseille de mettre des filtres... :lol:

BlueDream a dit:
J'utilisais ce parser sans souci à l'époque. Tu met les datas comme tu les recois.
Euh, j'ai du mal à suivre, vous parler de quel parser ?
 
Dernière édition par un modérateur:

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#10
bomikrob a dit:
Bonjour,

je rencontre un problème assez ennuyeux :

Il se trouve que dans 1 packets, j'obtiens 2 ID, ce qui fait que mon programme ne cherche plus à analyser les packets suivants :



Je pense que le problème vient de la classe parsing :

Code:
Public Shared Waiting As Integer
    Public Shared Data_Out() As Byte
    Public Shared Data() As Byte
    Public Shared Launched As Boolean

    Private NoPacket As Integer = Nothing

    Public Sub parsing(ByVal data() As Byte, ByVal NoPacket As Integer)
        If (data.Length > 2) Then
            Me.NoPacket = NoPacket
            Try
                Dim index As Integer ' pour savoir ou on est
                Dim id_and_length As UShort ' les 2 premiers octets (16 bits)
                Dim packet_id As UShort ' les 14 premiers bits des 16
                Dim packet_length_of As Byte ' les 2 derniers bits des 16
                Dim packet_length As Integer ' la longueur du packet
                Dim Packet_Start As Integer
                Dim Packet_End As Integer


                If Waiting > 1 Then ' le buffer etait trop petit ?
                    Dim data_temps(data.Length + Data_Out.Length - 1) As Byte ' on créé un tableau de byte temporaire
                    Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length) ' on met le debut du paquet trop long dans le tableau temporaire
                    Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length) ' on met la reception a la suite
                    data = data_temps ' on met le tableau temporaire dans le tableau de travail
                End If

                Do Until index = data.Length ' on traite jusque la fin
                    Packet_Start = index
                    id_and_length = data(index) * 256 + data(index + 1) ' les 2 premiers octets
                    packet_length_of = id_and_length And 3 ' on veut les 2 derniers bits donc on masque (and) avec 11 en binaire (3 en decimal)
                    packet_id = id_and_length >> 2 ' on veut les 14 premiers bits donc on decale les 16 bits de 2 bits vers la droite
                    index += 2 + packet_length_of  ' on avance des 2 octets de id_and_length + du nombre d'octets de la taille de taille

                    Select Case packet_length_of ' on lit le bon nombre d'octet pour connaitre la taille des données
                        Case 0
                            packet_length = 0
                        Case 1
                            packet_length = data(index - 1)
                        Case 2
                            packet_length = 256 * data(index - 2) + data(index - 1)
                        Case 3
                            packet_length = 65536 * data(index - 3) + 256 * data(index - 2) + data(index - 1)
                    End Select

                    If index + packet_length > data.Length Then ' buffer trop petit ?
                        Waiting = packet_length + index - Packet_Start ' alors on le signale
                        ReDim Data_Out(data.Length - Packet_Start - 1) ' on redimensionne le tableau de debut du paquet trop long
                        Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start) ' on copie le debut du paquet trop long
                        Exit Sub ' on sort
                    End If

                    Dim packet(0) As Byte ' on prepare le paquet
                    If packet_length > 0 Then ' si sa taille est plus grande que 0 on redimensionne
                        ReDim packet(packet_length - 1)
                        Array.Copy(data, index, packet, 0, packet_length) ' et on copie les donnée
                    End If

                    DataCheck(packet_id, New Dofus.DofusReader(New IO.MemoryStream(packet))) ' on verra plus tard
                    index += packet_length ' on met l'index a jour
                    Packet_End = index
                    If Packet_End = data.Length Then ' si ca tombe pile poil alors le buffer etait assez grand
                        Waiting = 0 ' on reset
                        ReDim Data_Out(0) ' on reset
                    End If
                Loop

            Catch e As Exception
                F_listePacketID.L_packet.Items.Add(NoPacket)
                F_listePacketID.L_id.Items.Add("NaN")
                F_listePacketID.L_exception.Items.Add(e.Message)
            End Try
        End If

    End Sub
Merci de votre aide :)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#11
Merci, mais il vient d'où ?
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#12
C'est celui de Toons , utilisé dans LeafBot et OverEdge's Bot :) .
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#13
Tu as lu tout le forum a ce que je vois ;)
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#14
BlueDream a dit:
Tu as lu tout le forum a ce que je vois ;)
Deux fois , sauf les parties privées ^^ .Et je me sens pas à l'aise par que j'ai raté pas mal de beau et bon tuto (free.Cadernis. fr)
 
Dernière édition par un modérateur:
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#15
Pour rajouter mon grain de sel, y'a 3 cas possibles :
- Plusieurs messages dans un paquets TCP ; Si y'a de la place pour en caser plusieurs, pourquoi s'en priver ? C'est le protocole qui est comme ça.
- Un message dans plusieurs paquets TCP ; Quand c'est des gros messages (RDM, DataContainer), ils sont balancés en plusieurs fois. Encore et toujours le protocole qui est comme ça.
- Un message dans un paquet TCP ; Pas besoin d'éclaircir plus là-dessus. If it fits, I sits.

Donc au final, un parser bien fait gère tout ça, selon moi, ça n'a rien à voir avec le protocole Dofus, c'est simplement faire un parser correct pour le protocole TCP.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#17
Quel rapport ? D'un côté on parle de réception, de l'autre d'envoi...
Mais merci pour l'info :D
Et il me semble que c'était cadernis.free.fr, le site où on apprend à coder des bots :p
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#18
est ce que ca passe 2 fois par cette ligne quand tu as 2 messages dans le meme paquet ?
Code:
DataCheck(packet_id, New Dofus.DofusReader(New IO.MemoryStream(packet))) ' on verra plus tard
' on verra "plus tard" c'etait a l'epoque pour expliquer ce que ca fait (mais y'avait d'autres choses a expliquer avant) mais en fait ca doit entrer dedans et pas "plus tard"

et quand le 2ieme message est passé (si il passe) est que ca passe par cette ligne ?
Code:
 Waiting = 0 ' on reset
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#19
jones a dit:
http://fr.wikipedia.org/wiki/Algorithme_de_Nagle
Voilà qui vient conforter ce que je pensais, j'en avais pas connaissance. Thanks !

Labo a dit:
Et il me semble que c'était cadernis.free.fr, le site où on apprend à coder des bots :p
Ça répond à tes questions ? Les choses changent, les URLs aussi. :D
Et au final, même si mon explication se positionne côté envoi, elle aide à comprendre le côté réception par la même occasion.
 
Haut Bas