Public Sub parsing(ByVal data() As Byte)
Try
Dim Serveur As String = Form1.ServerSock.RemoteEP.Address.ToString 'pour savoir sur quel serveur on est
Dim sock As BazSocket = CType(Form1.lstClient.Items(0), Client).Socket
If Serveur <> "213.248.126.180" Then ' si pas serveur de loging on copie data vers le jeu
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(data)
End If
End If
Launched = True
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 > 0 Then
'Array.Copy(data, Packet_Start, Data_Out, Waiting, Data_Out.Length - Waiting)
Dim data_temps(data.Length + Data_Out.Length - 1) As Byte
Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length)
Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length)
data = data_temps
'Application.DoEvents()
End If
Do Until index = data.Length
Packet_Start = index
id_and_length = data(index) * 256 + data(index + 1)
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
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
Waiting = packet_length + index - Packet_Start
ReDim Data_Out(data.Length - Packet_Start - 1)
Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start)
Exit Sub
End If
Console.WriteLine("recu : id -> " & packet_id & " " & Id_to_String(packet_id) & " len -> " & packet_length)
If packet_id = 0 Then
Beep()
Exit Sub
End If
Dim packet(0) As Byte
If packet_length > 0 Then
ReDim packet(packet_length - 1)
Array.Copy(data, index, packet, 0, packet_length)
End If
If Form1.Debug.Checked And packet_length > 0 Then
Dim debug As String = ""
Dim j As Integer = 0
For i As Integer = 0 To packet_length - 1 ' on fait defiler tout les octets recus
debug += data(i).ToString("X2") & " "
j += 1
If j = 16 Then
debug += vbCrLf
j = 0
End If
Next
Console.WriteLine(debug & vbCrLf)
End If
DataCheck(packet_id, New Dofus.DofusReader(New IO.MemoryStream(packet)))
index += packet_length
'If Packet_End + index > data.Length Then
' Waiting = index
' ReDim Data_Out(Packet_End - Packet_Start - 1)
'End If
Packet_End = index
Dim data_temps(Packet_End - Packet_Start - 1) As Byte
Array.Copy(data, Packet_Start, data_temps, 0, data_temps.Length)
If Serveur = "213.248.126.180" Then ' si serveur de loging
If packet_id = 42 Then 'si c'est packet qui contient l'ip de serveur de jeu
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(Data_Out) ' on envoie au jeu un faux paquet qui contient 127.0.0.1 pour l'ip de serveur de jeu
End If
CType(Form1.lstClient.Items(0), Client).Socket.Close()
Do Until Form1.lblStatServeur.Text = "Serveur : Déconnecté"
Application.DoEvents()
Loop
Form1.ServerSock.Connect(Form1.Address, 5555)
Else
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(data_temps)
End If
End If
End If
If Packet_End = data.Length Then
Waiting = 0
ReDim Data_Out(0)
End If
Loop
Launched = False
'Console.WriteLine()
Catch e As Exception
Console.WriteLine("parsing() " & e.TargetSite.Name & " -> " & e.Message)
End Try
End Sub