C# [RESOLU]Probleme Thread

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#1
Salut à tous !
Voulant faire un petit bot , j'au repris le tuto de TheGeek bien qu'il soit vieux avec les IO de Asyad sauf que je galère avec un thread qui veut pas se lancer . Le bot se connecte au serveur d'authentification et puis il s’arrête .
Voici ma class :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using RaidBot.Common.IO;


namespace RaidBot
{
public partial class Form1 : Form
{
#region COnstructeurs
public Form1()
{
InitializeComponent();
}
#endregion

#region Attributs
private Socket _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private Thread _ReceptionThread;
#endregion


#region Methodes privées

private void Log(string Text)
{
Action log_callback = (Action)delegate
{
TXT_Log.Text += Text + "\r\n"; // Ajout du texte avec un saut à la ligne en fin.
TXT_Log.Select(TXT_Log.Text.Length, 0); // On place le curseur à la fin de la zone de texte.
TXT_Log.ScrollToCaret(); // On descend la barre de défilement jusqu'au curseur.
};
this.Invoke(log_callback);
}

private void BT_Connexion_Click(object sender, EventArgs e)
{
try
{
_Socket.Connect("213.248.126.39", 5555); // Connexion au serveur d'authentification.

// On test l'état de la connexion.
if (_Socket.Connected)
{
Log("La connexion au serveur d'authentification est réussie.");
_ReceptionThread = new Thread(new ThreadStart(Reception));
_ReceptionThread.Start();
}
else
{
Log("La connexion au serveur d'authentification a échouée.");
}


}
catch (SocketException sock_ex)
{
Log("[SocketException] " + sock_ex.Message);
}
}

private void Reception()
{
// On reçoit les données tant qu'on est connecté.
while (_Socket.Connected)
{
// On crée notre buffer dynamique.
byte[] _buffer = new byte[_Socket.Available];

// Si le buffer n'est pas vide, on le parse.
if (_buffer.Length != 0)
{
_Socket.Receive(_buffer); // Récéption des données.
ParseData(_buffer); // Parsing des données.
}
}
}

private void ParseData(byte[] DataToParse)
{
// Déclaration des variables qui seront utilisées
int index = 0;
short id_and_packet_lenght_type, packet_id, packet_lenght_type;
Int32 packet_lenght = 0;
byte[] packet_content;

// Lecture jusqu'à la fin de byte[] data
while (index != DataToParse.Length)
{
// Décodage du header
id_and_packet_lenght_type = (short)(DataToParse[index] * 256 + DataToParse[index + 1]); // Selection des 2 premiers octets du paquet
packet_id = (short)(id_and_packet_lenght_type >> 2); // Récupérer l'ID du paquet
packet_lenght_type = (short)(id_and_packet_lenght_type & 3); // Récupérer la taille de la taille de la longueur du paquet

index += 2; // On se déplace 2 octets plus loin

// Récupération de la taille du paquet
switch (packet_lenght_type)
{
case 0:
packet_lenght = 0;
break;
case 1:
packet_lenght = DataToParse[index];
break;
case 2:
packet_lenght = DataToParse[index] * 256 + DataToParse[index + 1];
break;
case 3:
packet_lenght = DataToParse[index] * 65536 + DataToParse[index + 1] * 256 + DataToParse[index + 2];
break;
}

// Récupération du contenu du paquet
packet_content = new byte[(int)packet_lenght];
Array.Copy(DataToParse, index + packet_lenght_type, packet_content, 0, packet_lenght);

// Création de la variable contenant le contenu du paquet en héxadécimal
string content_hex = string.Empty;
int huit_bytes = 0;
foreach (byte b in packet_content)
{
if (huit_bytes == 8)
{
content_hex += "\r\n";
huit_bytes = 0;
}
content_hex += b.ToString("X2") + " ";
huit_bytes++;

}

// Jounalisation
Log("[Reçu] ID = " + packet_id + " | Taille du contenu = " + packet_lenght + "\r\n" + content_hex);

// Traitement du paquet
TreatPacket(packet_id, packet_content);

// Définition de l'index qui démarre le paquet suivant
index += packet_lenght + packet_lenght_type;
}
}

private void TreatPacket(int PacketID, byte[] PacketContent)
{
CustomDataReader reader = new CustomDataReader(PacketContent);
switch (PacketID)
{
case 1:
// Ici nous savons que nous sommes bien connecté au serveur.
break;
}
}

#endregion





}
}
 
Inscrit
19 Aout 2014
Messages
16
Reactions
0
#2
Re: Probleme Thread

Code:
m_ReceptionThread = new Thread(SocketReception);
?
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#3
Re: Probleme Thread

Sadikk a dit:
Code:
m_ReceptionThread = new Thread(SocketReception);
?
J'ai pas compris x) ? est-ce-qu'il faut que j'ajoute ce bout de code ? j'en vois pas l'utilité :/ .
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Re: Probleme Thread

Non non non, ton thread va très bien.

Essaye de mettre une pause éventuellement avant de lancer ton thread de réception.
Il se peut que le Socket n'ait pas le temps de se connecter.
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#5
Re: Probleme Thread

BlueDream a dit:
Non non non, ton thread va très bien.

Essaye de mettre une pause éventuellement avant de lancer ton thread de réception.
Il se peut que le Socket n'ait pas le temps de se connecter.
Et non , mon socket se connecte bel et bien . C'est juste une question d'un BasiPingMessage comme me l'avait dit Moonlight-Angel (Merci à lui au passage , et merci à Sadik qui a consacré pas mal de son temps pour m'aider ) .
Sauf que j'ai pas encore test vu que lors de la traduction j'ai rencontré le mot BasicPingMessage : NetworkMessage et je cherche qu'est que c'est le NetworkMessage.
Merci pour vos reponses !
Cordialement.
 
Dernière édition par un modérateur:
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#6
Re: Probleme Thread

Le NetworkMessage c'est la classe mère de tous les messages de mémoire. Elle se trouve dans le jerakine ;)
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#7
MERCI A MOONLIGHT-ANGEL.
EN FAIT , IL FALAIT JUSTE ENVOYER UN BASICPINGMESSAGE :) .
OULLLLAAAAH COMME JE SUIS CONTENT POUR AVOIR RECU LE 1 ET LE 3 :')
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Un BasicPingMessage avant le 1 et le 3 ???
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#9
Dernière édition par un modérateur:
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#10
Moi je n'envoie pas de BasicPing et je reçois bien le 1 et le 3 ...
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#11
Oui , mais il y a toujours des exceptions . :D
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#13
Pour ceux qui se poseraient la question, oui des fois on ne reçoit pas de message à la connection (ou alors faut attendre longtemps).
Du coup, pour donner un coup de fouet au serveur et le réveiller on balance un BasicPingMessage. Tout le monde n'en a pas besoin cependant. Je sais que chez moi ça le faisait en C# mais ça ne le fait plus en C++. Allez comprendre.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#14
C'est encore à cause de microsoft ca. Ca sent le complot a plein nez
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#15
Tu veux dire qu'il existe une alliance antre Anka et Microsoft ? :o
 
Haut Bas