Autre [MUDOWN][DotNet] D2Com, facilitez la communication D2 :)

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#61
Re: [DotNet] D2Com, facilitez la communication D2 :)

Dans ce cas, je demande juste un petit exemple rapide du fonctionnement de AsyncRecv et AsyncAccept ;)

Comment veux tu placer alors le Monitor.Wait ? Avant le lock ?*
Code:
while(true)
{
   while(m_Queue.Count == 0)
      Monitor.Wait(m_Locker);

  lock(m_Locker)
  {
      // action
  }

}
Le Thread.Sleep(1) c'était juste pour faire la schématisation de la classe Monitor afin de savoir si j'avais compris son fonctionnement :p

EDIT : il n'est pas possible d'appeller Monitor.Wait en dehors d'un lock() :/
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#62
Re: [DotNet] D2Com, facilitez la communication D2 :)

J'ai joint un exemple d'utilisation des fonctions asynchrones.

Oui effectivement, je me suis emmêlé les pinceaux, j'utilisais Monitor.Enter/Leave mais c'est inutile, le lock le remplace. Au temps pour moi.
 
A

Anonymous

Invité
#63
Re: [DotNet] D2Com, facilitez la communication D2 :)

Je viens de voir ton exemple, je t'en remercie :p
Ceci dit, puis-je juste te demander de le simplifier en enlevant les couches qui te sont propres histoire d'avoir une visibilité uniquement sur les méthodes et attributs dédiés à la socket.
Merci encore ;)
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#64
Re: [DotNet] D2Com, facilitez la communication D2 :)

De manière plus clair ça donne ça

Code:
private void ReceiveLoop()
{
	if (!Connected)
		return;
	
	var args = new SocketAsyncEventArgs();
	args.Completed += OnReceiveCompleted;
	args.SetBuffer(new byte[8192], 0, 8192);

	if (!Socket.ReceiveAsync(args))
	{
		ProcessReceiveCompleted(args);
	}
}

private void OnReceiveCompleted(object sender, SocketAsyncEventArgs args)
{
	switch (args.LastOperation)
	{
		case SocketAsyncOperation.Receive:
			ProcessReceiveCompleted(args);
		break;
		case SocketAsyncOperation.Disconnect:
			Disconnect();
		break;
	}
}

private void ProcessReceiveCompleted(SocketAsyncEventArgs args)
{
	if (!Connected)
		return;

	if (args.BytesTransferred <= 0 ||
			args.SocketError != SocketError.Success)
	{
		Disconnect();
	}
	else
	{
		/* parse le message ici */

		ReceiveLoop();
	}

}
 
A

Anonymous

Invité
#65
Re: [DotNet] D2Com, facilitez la communication D2 :)

Pourquoi utiliser ReceiveAsync de cette facon? Je vois que tu l'utilises correctement dans ton exemple précédent mais le dernier que tu donnes détruit complètement la raison pourquoi ReceiveAsync a été créer. Pour les performances, l'utilisation de ReceiveAsync est vraiment mieux si on utilises un pool, sinon ca ne sers à rien et c'est seulement plus compliquer que l'utilisation de BeginReceive.

Alors pour quelqu'un qui n'est pas trop familier avec les sockets, je conseillerais plutot BeginReceive. Si tu veux te lancer dans le ReceiveAsync, assures-toi seulement d'avoir un pool de SocketAsyncEventArgs et d'en attribuer un seul par socket (Pour ca regardes plutot le premier exemple de Bouh2, lui est bon).
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#66
Re: [DotNet] D2Com, facilitez la communication D2 :)

Dans mon cas c'était inutile vu que j'avais un Socket ouvert par client. Si c'est un serveur qui doit dispatch les messages c'est effectivement nécessaire. Sinon je vois pas pourquoi ce serait impératif.
 
A

Anonymous

Invité
#67
Re: [DotNet] D2Com, facilitez la communication D2 :)

Dans mon cas c'est mon application qui est le client.
Faut que je prenne le temps de bien voir comment ça marche tout ça, et ce n'est pas le temps qui est en ma faveur désormais :(
 
A

Anonymous

Invité
#68
Re: [DotNet] D2Com, facilitez la communication D2 :)

La raison pourquoi ReceiveAsync a été créer est pour ne pas avoir à créer un nouvel objet à chaque fois qu'une opération socket doit être faite (Contrairement à BeginReceive qui doit créer un nouveau IAsyncResult à chaque fois). C'est pourquoi un pool est nécessaire. Sinon, on ce retrouve avec l'équivalent de BeginReceive mais avec de la complexité en plus, ce qui est donc inutile.

Pour un bot Dofus, je ne vois pas trop la nécessité d'utiliser ReceiveAsync, à moin que tu veux rouler des centaines (voir des milliers) de bots en même temps. Sinon, BeginReceive fait très bien. Après tout, il ne sagit pas ici de créer un logiciel de serveur qui scale vraiment bien. Bon, bouh2 fait des serveurs Dofus ca peut lui être très utile si il veut avoir beaucoup de clients connecter, mais pour un bot qui n'est pas à une échelle industrielle, je ne vois pas de raisons d'aller vers le ReceiveAsync.

Alors si tu veux mon avis, tu devrais utiliser BeginReceive/EndReceive.
 
A

Anonymous

Invité
#69
Re: [DotNet] D2Com, facilitez la communication D2 :)

Dans ce cas pourrais tu fournir un exemple de code simple quant a l'utilisation de BeginReceive et EndReceive ?
 
Inscrit
1 Aout 2010
Messages
44
Reactions
0
#71
Re: [DotNet] D2Com, facilitez la communication D2 :)

Très beau projet =p.
Bonne chance pour Le World !
 
A

Anonymous

Invité
#72
Re: [DotNet] D2Com, facilitez la communication D2 :)

Suite à un manque énorme de temps (cours, taff etc.) je ne peux plus continuer le développement :/
Je suis désolé à pour ceux qui suivait le projet et qui utilisait D2Com.
J'ai appris aussi que depuis la MAJ, certains points ont changés ce qui rend D2Com obsolète.
Bon dev à vous tous.
 
A

Anonymous

Invité
#73
Re: [DotNet] D2Com, facilitez la communication D2 :)

Certain aimerais que tu leek les source aux grand publique pour modifier sans filter les packet via wpe par exemple
 
A

Anonymous

Invité
#74
Re: [DotNet] D2Com, facilitez la communication D2 :)

Oh ouii les sources seraient sympa :D
 
A

Anonymous

Invité
#75
Re: [DotNet] D2Com, facilitez la communication D2 :)

Je vais lui laisser un mail :) et lui parler msn si il peut les leeker je promet rien et lui non plus !
 
A

Anonymous

Invité
#77
Re: [DotNet] D2Com, facilitez la communication D2 :)

sympa :D
 
A

Anonymous

Invité
#78
Re: [DotNet] D2Com, facilitez la communication D2 :)

Merci beaucoup !
 
A

Anonymous

Invité
#79
Re: [DotNet] D2Com, facilitez la communication D2 :)

Cimer ;)
 
A

Anonymous

Invité
#80
Re: [DotNet] D2Com, facilitez la communication D2 :)

Je fais appel à tous !
J'ai perdu l'intégralité des mes sources y compris D2Com. Je vous demande donc de pouvoir m'envoyer par MP un lien de téléchargement de la dernière version des sources publiées.

Je vous en suis reconnaissant !
 
Haut Bas