Client IRC [Sockets/Threads]

Résolu
SpecialCharacter Messages postés 12 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 23 mai 2007 - 6 mai 2007 à 11:10
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 6 mai 2007 à 13:07
Bonjour, je me suis mis à la programmation d'un petit client IRC

Il ressemble en beaucoup de points à tous ceux des débutants je n'en doute pas.

Il est assez délicat de gérer ces connexions avec les \r\n, en tout cas
pour ma part il semble que le problème se situe ici, en effet, je ne
reçois pas tous les messages que je devrais (Je fais le parallèle avec
XChat en journal brute pour voir ce qui diffère...)

Voici mon code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace Client_IRC
{
public partial class Dialogue : Form
{
// Création du socket de connexion au server.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Délégué pour la gestion de la ChatBox par le ThreadAffichage.
privatedelegatevoid TextBoxDelegateHandler(string str);
private TextBoxDelegateHandler TextBoxDelegate;
byte[] reception = newbyte[1024];
 
public Dialogue()
{
InitializeComponent();
TextBoxDelegate = new TextBoxDelegateHandler(UpdateData);
Thread t_reception = new Thread(new ThreadStart(ThreadReception));
Thread t_affichage = new Thread(new ThreadStart(ThreadAffichage));
 
socket.Connect(new IPEndPoint(Dns.GetHostAddresses("irc.epiknet.net")[0], 6667));

t_reception.Start();
t_affichage.Start();
 
 
byte[] envoi = Encoding.Default.GetBytes("NICK Tastee\r\nUSER guest tolmoon tolsun :Ronnie Reagan\r\n");
 
try
{
int i = socket.Send(envoi, 0, envoi.Length, SocketFlags.None);
ChatBox.Text = "Envoyé: " + i + " octets.\r\n";
}
catch(SocketException Ex)
{
MessageBox.Show("Erreur: " + Ex.Message);
}
}
privatevoid UpdateData(string str)
{
ChatBox.Text += str;
}
 
privatevoid ThreadReception()
{
while(true)
{
try
{
socket.Receive(reception, 0, reception.Length, SocketFlags.None);
}
catch(SocketException Ex)
{
MessageBox.Show("Connexion interrompue: " + Ex.Message);
Thread.CurrentThread.Abort();
}
Thread.Sleep(100);
}
}
privatevoid ThreadAffichage()
{
try
{
Invoke(TextBoxDelegate, Encoding.ASCII.GetString(reception));
}
catch
{
Thread.CurrentThread.Abort();
}
Thread.Sleep(100);
}
 
privatevoid textBox1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
byte[] envoi = Encoding.Default.GetBytes(textBox1.Text + "\r\n");
socket.Send(envoi, 0, envoi.Length, SocketFlags.None);
textBox1.Text = "";
}
}
}
}

Je n'obtiens que ce message:

<!-- BEGIN TEMPLATE: bbcode_quote -->

Je n'obtiens que ceci...

Envoyé: 55 octets.

:toulouse2.fr.epiknet.org NOTICE AUTH :*** Looking up your hostname...

:toulouse2.fr.epiknet.org NOTICE AUTH :*** Checking ident...

Peut-être que je fais erreur du côté de l'encodage...mais je ne sais trop comment la résoudre

Merci de votre aide,
Cordialement

8 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 mai 2007 à 12:31
TcpClient facilite un peu les choses en masquant le travail sur les Socket.
A toi de voir si son utilisation correspond à ton besoin et ne deviendra pas bloquante à terme.

Je ne vois pas pourquoi tu utilises un thread dédié à l'affichage, mais ce qui est sur c'est qu'il ne s'execute qu'une seule fois :-)

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 mai 2007 à 11:39
Salut,

Je n'ai jamais approfondi le sujet mais avec IRC tu n'es pas censé attendre la réponse d'une commande avant d'envoyer la suivante ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
SpecialCharacter Messages postés 12 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 23 mai 2007
6 mai 2007 à 11:45
Bonjour Coq,

Ce n'est pas le cas avec IRC, par exemple on pourra envoyer NICK et USER à la suite, cf RFC 1459
Je ne sais trop quoi faire, ce protocole m'a l'air capricieux..mais je ne sais pas quoi utiliser entre TcpClient et les connection classique, je suis un peu perdu et ne comprend pas la différence entre les deux et leur utilité respective ,

Cordialement
0
SpecialCharacter Messages postés 12 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 23 mai 2007
6 mai 2007 à 12:04
Je viens de sniffer le flux avec WireShark, je reçois bien des données du server IRC, je crois que c'est plus un soucis d'encoding...je ne sais pas lequel utiliser j'ai testé avec Encoding.Defaut|ASCII|UTF8.GetString(recepetion); // recepetion > byte[256]

En attente d'une réponse...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 mai 2007 à 12:36
Sinon je ne sais pas si tu as choisis de tout implémenter toi même délibérement, mais il existe déjà des librairies IRC pour .NET, comme SmartIrc4net : http://smartirc4net.meebey.net/

/*
coq
MVP Visual C#
CoqBlog
*/
0
SpecialCharacter Messages postés 12 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 23 mai 2007
6 mai 2007 à 12:49
Merci pour tout Coq :) Je me penche de plus près sur ce soucis de Threading
0
SpecialCharacter Messages postés 12 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 23 mai 2007
6 mai 2007 à 12:58
Est-ce que tu pourrais m'expliquer pourquoi il ne s'execute qu'une fois ? Comment je devrais faire, c'est un peu me mâcher le travail mais j'aimerais comprendre et les tutos de développez.com ne sont pas très clairs quant à l'utilité de Suspend, Resume etc.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 mai 2007 à 13:07
Ba la méthode s'execute une seule fois, ta réception est toujours active car tu as mis une boucle infinie, chose que tu n'as pa faite dans l'ordre thread. Un thread ne "boucle" pas automatiquement sur la méthode.

Concernant le threading, tu peux consulter cet eBook de Joseph Albahari, Threading in C# : http://www.albahari.com/threading/





/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous