VB/VB.Net Passage Socket Connexion à Socket Jeu petit souci

A

Anonymous

Invité
#1
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:
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:
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:
Code:
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
Code:
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:
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:
Code:
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
Code:
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
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
Salut , MET DES BALISES DE CODE
pourquoi 110 envoyé 2 fois ?
 
A

Anonymous

Invité
#3
Hum bah aucune idée c'est le client qui l'envoi 2 fois
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
j'en suis pas sur du tout , dans ton log tu passes par une fonction pour le serveur de loging et une autre pour le serveur de jeu :
Reception id 3, Lenght -> 330 (pas de fleche a l'id)
Reception id -> 101, Lenght -> 0

fait gaffe de pas envoyer avec le parseur et aussi avec le data_arrival ou le listen
 
A

Anonymous

Invité
#5
Le problème venait effectivement de la !
Merci encore une fois ToOnS !

Résolu.
 
Haut Bas