VB/VB.Net Petit soucis avec le DataReader !

A

Anonymous

Invité
#1
Hello tout le monde , j'ai actuellement un soucis avec mon DataReader !

J'ai repris le tutoriel : -débuter-dans-le-développement-socket-d2-(complet).162/]viewtopic.php?f=6&t=394&hilit=Datareader

Et converti tout le code en Vb.net ..

Seulement voilà j'ai un soucis lors de la compilation , lorsque je compile,
j'ai ma Form qui s'affiche 2 second à peine :



Le contenu :
Code:
La connexion au serveur d'authentification est réussie.
[Reçu] ID = 1 | Taille du contenu = 8
00 00 06 13 00 00 06 17 
[Reçu] ID = 3 | Taille du contenu = 341
00 20 68 70 61 37 68 6E 
70 77 4C 4C 6F 74 51 39 
7D 52 2D 25 28 5F 2B 2C 
22 64 74 5C 56 7B 70 5E 
6A 48 01 31 A7 4A D6 D6 
16 67 57 7D D7 6C 9C 3C 
0B E9 9C 2F 79 09 3A F3 
BA 5E A5 21 AB 9F B3 D7 
B0 E7 F1 33 10 48 F9 F7 
26 2C 73 43 24 2A D9 47 
F4 AE 33 D2 2A 4F 0E 49 
FB 3F 72 2E F5 19 29 44 
AB D9 6A E1 39 3F 7C 7F 
EB 8D 91 9D F2 A9 5B 70 
61 39 74 A0 21 5E 94 7A 
07 B4 A9 10 AA FE A9 8B 
5C 11 13 50 2F 2E DD 30 
D7 A2 B3 F2 D5 F7 80 71 
82 7B 3F 36 6E C9 C3 1D 
D6 1B DC 0D 46 3E F7 DB 
AA 38 6F F6 9C 03 7F 48 
87 21 67 8F 05 47 A5 49 
85 87 0B 7C B4 E0 EF 40 
14 43 CC 6A 99 1E B1 3D 
B6 DE D5 6F E9 48 6E F2 
77 CF 2C 59 38 4C F2 02 
95 4B DF 44 FE 18 79 04 
DD A1 AA 9F 06 F4 A0 6A 
CC 81 45 A3 49 E3 A3 A3 
2D DD 04 15 D9 9F CD 45 
B9 41 17 F0 DF 38 B4 4C 
A8 99 95 B0 80 B4 73 5D 
2C 2B 03 F0 FD C8 9B 57 
EF 46 41 4F 92 EB C4 33 
E6 A5 BA FB 29 AA F0 0C 
F0 43 F8 0B 70 65 D2 AE 
E5 CA 35 03 F2 7C 09 BF 
F0 0A B4 71 C1 D6 95 72 
03 1A 5E C2 99 B8 A8 A6 
CF 68 32 13 73 2B D9 C8 
56 A8 FA FE B4 05 F6 EF 
51 A0 91 34 EF E0 53 EE 
87 C0 30 9F 15

Apres les 2 second, surviens cette magnifique erreur qui m'a bloqué toute l'aprem xD :



Voici le code de mon DataReader
Code:
Imports System.Text

Public Class DataReader
#Region "Attributs"
    Private _Content As Byte()
    Private _Position As Integer = 0
#End Region

#Region "Propriétés"
    ''' <summary>
    ''' Obtient ou défini le tableau d'octets en lecture.
    ''' </summary>
    Public Property Content() As Byte()
        Get
            Return Me._Content
        End Get
        Set(ByVal value As Byte())
            Me._Content = value
        End Set
    End Property

    ''' <summary>
    ''' Obtient ou défini la position du curseur de lecture.
    ''' </summary>
    Public Property Position() As Integer
        Get
            Return Me._Position
        End Get
        Set(ByVal value As Integer)
            Me._Position = value
        End Set
    End Property
#End Region

#Region "Constructeurs"
    ''' <summary>
    ''' Initialise une nouvelle instance de la classe D2Com.IO.DataReader.
    ''' </summary>
    Public Sub New()
    End Sub

    ''' <summary>
    ''' Initialise une nouvelle instance de la classe D2Com.IO.DataReader.
    ''' </summary>
    ''' <param name="content">Tableau d'octets à lire.</param>
    Public Sub New(ByVal content As Byte())
        Me._Content = content
    End Sub
#End Region

#Region "Méthodes publiques"
    ''' <summary>
    ''' Lit le prochain octet.
    ''' </summary>
    ''' <returns>L'octet.</returns>
    Public Function ReadByte() As Byte
        If Me._Content.Length >= 1 Then
            Dim result As Byte
            result = Me._Content(_Position)
            Me._Position += 1
            Return result
        Else
            Throw New Exception("Il n'y a plus d'octet à lire.")
        End If
    End Function

    ''' <summary>
    ''' Lit le nombre spécifié des prochains octets.
    ''' </summary>
    ''' <param name="number">Nombre d'octets à lire.</param>
    ''' <returns>Le tableau d'octets lus.</returns>
    Public Function ReadBytes(ByVal number As Integer) As Byte()
        If Me._Content.Length >= number Then
            Dim result As Byte() = New Byte(number - 1) {}
            Dim i As Integer = 0
            While i <> number
                result(i) = Me.ReadByte()
                i += 1
            End While
            Return result
        Else
            Throw New Exception("Il n'y a plus d'octets à lire.")
        End If
    End Function

    ''' <summary>
    ''' Lit les prochains octets de la longueur d'un short.
    ''' </summary>
    ''' <returns></returns>
    Public Function ReadShort() As Short
        If Me._Content.Length >= 2 Then
            Return CShort((Me.ReadByte() << 8) + Me.ReadByte())
        Else
            Throw New Exception("Il n'y a plus d'octets à lire.")
        End If
    End Function

    ''' <summary>
    ''' Lit les prochains octets de la longueur d'un int codé en 16 bits.
    ''' </summary>
    ''' <returns>Contenu de l'int.</returns>
    Public Function ReadIntOn16Bits() As Integer
        If _Content.Length >= 2 Then
            Dim i As Integer = CInt((Convert.ToUInt16(ReadByte()) << 8) + Convert.ToUInt16(ReadByte()))
            Return i
        Else
            Throw New Exception("Il n'y a plus d'octets à lire.")
        End If
    End Function

    ''' <summary>
    ''' Lit les prochains octets de la longueur d'un int.
    ''' </summary>
    ''' <returns>Contenu de l'int.</returns>
    Public Function ReadInt() As Integer
        If _Content.Length >= 4 Then
            Return CInt((ReadByte() << 24) + (ReadByte() << 16) + (ReadByte() << 8) + ReadByte())
        Else
            Throw New Exception("Il n'y a plus d'octets à lire.")
        End If
    End Function

    ''' <summary>
    ''' Lit les prochains octets codés en UTF8.
    ''' </summary>
    ''' <returns>Contenu de la châine.</returns>
    Public Function ReadString() As String
        Dim string_bytes As Byte() = ReadBytes(ReadIntOn16Bits())
        Return Encoding.UTF8.GetString(string_bytes)
    End Function

    ''' <summary>
    ''' Lit le prochain octet de la valeur d'un byte en le convertissant en bool
    ''' </summary>
    ''' <returns>Contenu du bool.</returns>
    Public Function ReadBool() As Boolean
        If ReadByte() = 1 Then
            Return True
        Else
            Return False
        End If
    End Function
#End Region
End Class



Le code de mon form :
Code:
Imports System.Net.Sockets
Imports System.Threading

Imports System.Net



Public Class Form1

    Private _Socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Public Function MD5(ByVal [String] As String) As String
        Dim cryptor As New System.Security.Cryptography.MD5CryptoServiceProvider()
        Dim hash_bytes As Byte() = System.Text.Encoding.UTF8.GetBytes([String])
        hash_bytes = cryptor.ComputeHash(hash_bytes)

        Dim buffer As String = ""
        For Each by As Byte In hash_bytes
            buffer += by.ToString("x2")
        Next

        Return buffer
    End Function
    Private Sub Reception()
        ' On reçoit les données tant qu'on est connecté.
        While _Socket.Connected
            ' On crée notre buffer dynamique.
            Dim _buffer As Byte() = New Byte(_Socket.Available - 1) {}

            ' Si le buffer n'est pas vide, on le parse.
            If _buffer.Length <> 0 Then
                _Socket.Receive(_buffer)
                ' Récéption des données.
                ' Parsing des données.
                ParseData(_buffer)
            End If
        End While
    End Sub
    Private Sub ParseData(ByVal DataToParse As Byte())
        ' Déclaration des variables qui seront utilisées
        Dim index As Integer = 0
        Dim id_and_packet_lenght_type As Short, packet_id As Short, packet_lenght_type As Short
        Dim packet_lenght As Int32 = 0
        Dim packet_content As Byte()

        ' Lecture jusqu'à la fin de byte[] data
        While index <> DataToParse.Length
            ' Décodage du header
            id_and_packet_lenght_type = CShort(DataToParse(index) * 256 + DataToParse(index + 1))
            ' Selection des 2 premiers octets du paquet
            packet_id = CShort(id_and_packet_lenght_type >> 2)
            ' Récupérer l'ID du paquet
            packet_lenght_type = CShort(id_and_packet_lenght_type And 3)
            ' Récupérer la taille de la taille de la longueur du paquet
            index += 2
            ' On se déplace 2 octets plus loin
            ' Récupération de la taille du paquet
            Select Case packet_lenght_type
                Case 0
                    packet_lenght = 0
                    Exit Select
                Case 1
                    packet_lenght = DataToParse(index)
                    Exit Select
                Case 2
                    packet_lenght = DataToParse(index) * 256 + DataToParse(index + 1)
                    Exit Select
                Case 3
                    packet_lenght = DataToParse(index) * 65536 + DataToParse(index + 1) * 256 + DataToParse(index + 2)
                    Exit Select
            End Select

            ' Récupération du contenu du paquet
            packet_content = New Byte(CInt(packet_lenght) - 1) {}
            Array.Copy(DataToParse, index + packet_lenght_type, packet_content, 0, packet_lenght)

            ' Création de la variable contenant le contenu du paquet en héxadécimal
            Dim content_hex As String = String.Empty
            Dim huit_bytes As Integer = 0
            For Each b As Byte In packet_content
                If huit_bytes = 8 Then
                    content_hex += vbCr & vbLf
                    huit_bytes = 0
                End If
                content_hex += b.ToString("X2") & " "

                huit_bytes += 1
            Next

            ' Jounalisation
            Log("[Reçu] ID = " & packet_id & " | Taille du contenu = " & packet_lenght & vbCr & vbLf & content_hex)

            ' Traitement du paquet
            TreatPacket(packet_id, packet_content)

            ' Définition de l'index qui démarre le paquet suivant
            index += packet_lenght + packet_lenght_type
        End While
    End Sub
    Private Sub TreatPacket(ByVal PacketID As Integer, ByVal PacketContent As Byte())
        Dim reader As New DataReader(PacketContent)
        Select Case PacketID
            Case 1
                Dim required As Integer = reader.ReadInt()
                Dim currrent As Integer = reader.ReadInt()
                Log("Required = " & required & " - Current = " & currrent & vbCr & vbLf)
            Case 3
                Dim connectionType As Integer = reader.ReadByte()
                Dim key As String = reader.ReadString()
                Log("ConnectionType = " & connectionType & " - Key = " & key & vbCr & vbLf)


        End Select
    End Sub
    Private Sub Log(ByVal Text As String)
        Dim log_callback As Action = DirectCast(Sub()
                                                    LogTextBox.Text += Text & vbCr & vbLf
                                                    ' Ajout du texte avec un saut à la ligne en fin.
                                                    LogTextBox.[Select](LogTextBox.Text.Length, 0)
                                                    ' On place le curseur à la fin de la zone de texte.
                                                    ' On descend la barre de défilement jusqu'au curseur.
                                                    LogTextBox.ScrollToCaret()

                                                End Sub, Action)
        Me.Invoke(log_callback)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Try
            _Socket.Connect("213.248.126.39", 5555)
            ' Connexion au serveur d'authentification.
            ' On test l'état de la connexion.
            If _Socket.Connected Then
                Log("La connexion au serveur d'authentification est réussie.")
                Dim _ReceptionThread = New Thread(New ThreadStart(AddressOf Reception))
                _ReceptionThread.Start()
            Else
                Log("La connexion au serveur d'authentification a échouée.")


            End If
        Catch sock_ex As SocketException
            Log("[SocketException] " + sock_ex.Message)
        End Try
    End Sub


End Class


...Et je pense que le soucis viens de cette partie là
Code:
 Private Sub TreatPacket(ByVal PacketID As Integer, ByVal PacketContent As Byte())
        Dim reader As New DataReader(PacketContent)
        Select Case PacketID
            Case 1
                Dim required As Integer = reader.ReadInt()
                Dim currrent As Integer = reader.ReadInt()
                Log("Required = " & required & " - Current = " & currrent & vbCr & vbLf)
            Case 3
                Dim connectionType As Integer = reader.ReadByte()
                Dim key As String = reader.ReadString()
                Log("ConnectionType = " & connectionType & " - Key = " & key & vbCr & vbLf)


        End Select
    End Sub


Merci d'avance !
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#2
le parser de ce tuto na jamais fonctionner :)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#3
Salut , il a jamais marché ce reader , ca vient de celui d'overedge (qui lui meme vient de l'ancien forum , en VB.net traduit en C# donc c'est l'inverse de ce que tu as fait) mais magouillé avec des choses en moins qu'il pensait useless , sauf que si ces choses sont la elles sont pas useless (comme le buffer secondaire data_out , il sert pas a chaque paquet mais parfois il sert)
bref , si tu veux pas t'embeter prend celui d'overedge qui lui est en plus deja en VB.net.

pour l'erreur en elle meme c'est que ce message (le 3) a changé depuis , il ne se lit plus de la meme maniere , decompile le swf du jeu , trouve le message id 3 , maximilia a fait un tuto pour faire ca , et tu verras que apres Dim connectionType As Integer = reader.ReadByte() , c'est different
 
A

Anonymous

Invité
#4
D'accord ! Merci , justement c'est ce que j'était entrain de me dire, alors j'essaye de mettre le parser de Overedge. J'ai bien dit j'essaye ! ^^
 
A

Anonymous

Invité
#5
@ToOs , justement j'ai un problème sur le parser, le meme qu'ici :
viewtopic.php?f=28&t=1320&hilit=probleme+tableau+%C3%A0+une+dimension

et que je n'arrive pas à résoudre , malgré les réponse que tu as fournis !

Jai cette erreur suivante :
Erreur 1 Impossible de convertir une valeur de type 'Tableau à 1 dimension(s) de Byte' en 'Bot.Dofus.DofusReader'. C:\Users\thomas\Documents\Visual Studio 2010\Projects\Bot\Bot\Form1.vb

(l'erreur se trouve sur packet_content)
 
Haut Bas