C# Delegate/Event

Rtxx

Membre
Inscrit
15 Novembre 2014
Messages
70
Reactions
0
#1
Bonjour à tous :) Me revoilà avec une autre question !

Je suis toujours bloqué au paquet 42.
Après la déconnexion du client connectée au serveur d'authentification, je connecte mon nouveau client sur le serveur de jeu obtenu via SelectedServerDataMessage.
Je reçois une donnée de taille 13 (non traitée) mais mon event qui me permet de traiter la donnée ne se déclenche pas.

C#:
using System.Net.Sockets;
using System.Net;
using System.Threading;
using SocketBot.IO;
using SocketBot.Utilities;

namespace SocketBot.Network
{
    class Client
    {
        private Socket _socket;
        private Thread receiveThread;
        public IPEndPoint _remoteEP;
        public int ProtocolId = 0;

        // delegate + event pour gérer la réception et l'envoi de données
        public delegate void onTravellingDataEventHandler(Client sender, byte[] buffer);
        public event onTravellingDataEventHandler onReception;
        public event onTravellingDataEventHandler onSending;

        // delegate + event pour gérer la connexion d'un client
        public delegate void onConnectedEventHandler(Client sender);
        public event onConnectedEventHandler onConnected;

        // delegate + event pour gérer la déconnexion d'un client
        public delegate void onDisconnectedEventHandler(Client sender);
        public event onDisconnectedEventHandler onDisconnected;


        public Client(Socket socket)
        {
            _socket = socket;
            receiveThread = new Thread(new ThreadStart(Receive));
        }

        public Client(IPEndPoint remoteEP)
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // on initialise la socket
            _remoteEP = remoteEP;
            receiveThread = new Thread(new ThreadStart(Receive));
        }

        /// <summary>
        /// Connexion et lancement du thread de réception des données serveur
        /// </summary>
        public void connectAndReceive()
        {
            if(!_socket.Connected)
                _socket.Connect(_remoteEP);

            receiveThread.Start();
            //onConnected?.Invoke(this);
        }

        /// <summary>
        /// Déconnexion du socket et arrêt du thread
        /// </summary>
        public void Disconnect()
        {
            try
            {
                if (receiveThread != null)
                {
                    receiveThread.Abort();
                    receiveThread = null;
                }
                _socket.Close();
            }
            catch
            {
            }
            onDisconnected?.Invoke(this);
        }

        /// <summary>
        /// Méthode utilisée par le thread receiveThread, permet la réception de données du serveur
        /// </summary>
        private void Receive()
        {
            while (_socket.Connected)
            {
                if (_socket.Available > 0)
                {
                    byte[] buffer = new byte[_socket.Available];
                    _socket.Receive(buffer);
                    onReception?.Invoke(this, buffer);
                }
            }
        }

        /// <summary>
        /// Envoi de données au serveur
        /// </summary>
        /// <param name="packet">Classe du protocol Dofus</param>
        public void Send(NetworkMessage packet)
        {
            ProtocolId = packet._ProtocolId;
            BigEndianWriter writer = new BigEndianWriter();
            packet.Pack(writer);
            _socket.Send(writer.Data);
            onSending?.Invoke(this, writer.Data);
        }
    }
}

C#:
_client.onReception += OnDataReceived;
_client.onSending += OndataSending;
_client.onDisconnected += OnSocketDisconnected;
_client.onConnected += OnConnectedClient;

C#:
public void OnDataReceived(Client sender, byte[] buffer)
{
    TreatPacket(buffer);
    BigEndianReader _reader = new BigEndianReader(ContentTreated);
    BigEndianWriter _writer = new BigEndianWriter();

    AddItem(false, id, idNames.GetClasseName(id), Length, ContentTreated);
    switch (id)
    {
        case 42:
            SelectedServerDataMessage Ssdm = new SelectedServerDataMessage();
            Ssdm.Deserialize(_reader);
            Client GameSocket = new Client(new IPEndPoint(IPAddress.Parse(Ssdm._address), Ssdm._port));
            GameSocket.connectAndReceive();
            sender.Disconnect();
            sender = null;
            /*sender = new Client(new IPEndPoint(IPAddress.Parse(Ssdm._address), Ssdm._port));
            sender.connectAndReceive();*/
            AddLog(LogType.Information, "Connexion au serveur de jeu ...");
            break;
    }
}

Le projet en entier disponible sur github.

Merci d'avance ! :D

EDIT : modification du post suite au message de asaki.
 
Dernière édition:

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#2
Comme je vois que tu galères depuis un moment je vais essayer de te sortir de là, moi dans mon case 42 je traite comme ceci:

C#:
case ServerPacketEnum.SelectedServerDataMessage:
                    SelectedServerDataMessage selected = (SelectedServerDataMessage)e.Packet;
                    _ConsoleUC.Log(LogMessageType.Noob, "Connexion au serveur " + (ServerNameEnum)selected.ServerId + "...");
                    _ticket = AES.DecodeWithAES(selected.Ticket);
                    _client.GameSocket = new DofusBotSocket(_deserializer, new IPEndPoint(IPAddress.Parse(selected.Address), selected.Port));
                    _ConsoleUC.Log(LogMessageType.Noob, "Connexion en cours <" + selected.Address + ":" + selected.Port + ">");
                    _client.GameSocket.ConnectEndListen();
                    _client.GameSocket = _client.GameSocket;
                    _client.ServerSocket.CloseSocket();
                    _client.ServerSocket = null;
                    break;
Ce qui a l'air d'être ton cas, du coup le problème ne viens certainement pas de là. Je vais dl ton projet et voir d'ou ça pourrais venir :)
 

Rtxx

Membre
Inscrit
15 Novembre 2014
Messages
70
Reactions
0
#3
Je te remercie :) Tu as discord ?

En fait j'ai fait quelques test, en modifiant la ligne "onReception?.Invoke(this, buffer);" dans la méthode Receive() du Client, par "onReception.Invoke(this, buffer);", j'obtiens une erreur lors de la réception du premier paquet du serveur de jeu :

System.NullReferenceException : 'La référence d'objet n'est pas définie à une instance d'un objet.'

onReception a été null.

EDIT : J'avais oublié de faire la redirection des event après la connexion d'un nouveau client.
 
Dernière édition:

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#4
Mon discord: yovano_c#4592
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#5
C'est un bot mitm si je me trompe pas ? On ne gère pas le packet comme en socket. Maintenant je vois que tu utilise mes dll sans même m'avoir démence et tu les publie sans même m'avoir encore une fois demander, je refuse maintenant qu'on utilise c'est dll la !!!
 

Rtxx

Membre
Inscrit
15 Novembre 2014
Messages
70
Reactions
0
#6
C'est un bot mitm si je me trompe pas ? On ne gère pas le packet comme en socket. Maintenant je vois que tu utilise mes dll sans même m'avoir démence et tu les publie sans même m'avoir encore une fois demander, je refuse maintenant qu'on utilise c'est dll la !!!
Salut, tu parles des DLL pour traduire le ticket ? Si oui, j'en suis désolé je l'ai vu sur un autre bot (pas le tien) donc j'ai juste pris les DLL... Je trouverai une alternative ce soir :)

Et non c'est un bot socket.
 
Haut Bas