J'ai une petite information qui pourrais peut être nous aider, des fois par chances le paquets passe et je peux passer à l'écran des personnages. Peut être le parseur ?
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
If IsServer = True Then
MyLog.WritePaquet(packet_id, packet_length, True)
Dim PI As New PacketIdentificator
Console.WriteLine("Reception id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
Else
MyLog.WritePaquet(packet_id, packet_length, False)
Dim PI As New PacketIdentificator
Console.WriteLine("Envoi id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
End If
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
Je viens de faire quelque test je ne pense pas que cela vienne de la.