Bonjour,
je recode un MITM en entier et je rencontre un petit souci, quand je passe du socket connexion au socket jeu rien d'anormal se produit, je recoi les paquet ect... MAIS, je recoi le paquet 109 qui correspond à AlreadyConnectedMessage. Donc quelqu'un est connecté sur mon compte, en fait c'est mon socket connexion qui s'est mal déconnecté d'ou la reception de ce paquet.
Voilà mon code:
If Not packet_id = 42 Then
Console.WriteLine("Reception id " & packet_id & ", Lenght -> " & packet_length)
MySock.Send(data)
Else
Dim _SSD As New Network.Connection.Server.Select.SelectedServerDataMessage
_SSD.deserialize(New DofusReader(New System.IO.MemoryStream(packet)))
Main.GameIp = _SSD.address
Main.GamePort = _SSD.port
Dim SSD As New Network.Connection.Server.Select.SelectedServerDataMessage
SSD.init(_SSD.serverId, "127.0.0.1", 443, _SSD.canCreateNewCharacter, _SSD.ticket) ' ces qui qui ecoute le porte 443
SSD.pack(MySock)
ServerSock.Close()
MySock.Close()
End If
Mais bien sur au moment du changement de socket, lorsque je ferme le socket du client voilà ce que j'obtient:
Cliquez pour révéler
Cliquez pour masquer
parsing() OnClosed -> Le thread a été abandonné.
Sachant que mon code est a priori bon, le souci vien de la fermeture de ce socket.
Voilà mes fonction qui écoute Client/Serveur:
Private Sub Client_DataArrival(ByVal sender As Object, ByVal data() As Byte) Handles MySock.DataArrival
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
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
Console.WriteLine("envoi : id -> " & packet_id & " len -> " & packet_length)
index += packet_length
Loop
ServerSock.Send(data)
End Sub
Private Sub ListenServer()
While ServerSock.Connected ' boucle infinie tant que connecté
Dim i = ServerSock.Receive(buffer) ' on met dans i le nombre d'octets recu
Dim data(i - 1) As Byte ' on créé un tableau de bytes du nombre de bytes recus
Array.Copy(buffer, data, i) ' on copie buffer dans data
parsing(data)
End While
End Sub
Et mes logs:
Cliquez pour révéler
Cliquez pour masquer
Reception id 1, Lenght -> 8
Reception id 3, Lenght -> 330
envoi : id -> 4 len -> 284
Reception id 10, Lenght -> 4
Reception id 6314, Lenght -> 0
Reception id 10, Lenght -> 4
Reception id 22, Lenght -> 42
envoie : id -> 42 len -> 1
parsing() OnClosed -> Le thread a été abandonné.
Reception id -> 1, Lenght -> 8
Reception id -> 101, Lenght -> 0
Envoi id -> 110, Lenght -> 38
Envoi id -> 110, Lenght -> 38
Reception id -> 112, Lenght -> 0
Reception id -> 189, Lenght -> 5
Reception id -> 176, Lenght -> 0
Dans mes logs le 109 ne s'affiche pas, je pense le paquet n'a pas eu le temps de s'afficher.
Voilà si vous avez une idée ?
EDIT:
Voilà le code de mon ancien MITM qui fonctionne:
Reception 42:
Case Network.Server.Select.SelectedServerDataMessage.protocolId
Dim Data = New Network.Server.Select.SelectedServerDataMessage
Data.deserialize(PacketData)
Client.Main.GameIp = Data.address
Client.Main.GamePort = Data.port
Data.init(Data.serverId, "127.0.0.1", 443, Data.canCreateNewCharacter, Data.ticket)
Dim writer As New DofusWriter
Data.serialize(writer)
Data_Out = DofusWriter.Send(ID, Client.MySock)
Client.SockServer.Close()
Client.MySock.Close()
Client.GameIp = Data.address
Client.GamePort = Data.port
If send Then
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
Client.MySock.Close()
Else
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(data_temps)
End If
End If
End If
End If