Client IRC [Sockets/Threads] [Résolu]

Signaler
Messages postés
12
Date d'inscription
lundi 2 avril 2007
Statut
Membre
Dernière intervention
23 mai 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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
*/
Messages postés
12
Date d'inscription
lundi 2 avril 2007
Statut
Membre
Dernière intervention
23 mai 2007

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
Messages postés
12
Date d'inscription
lundi 2 avril 2007
Statut
Membre
Dernière intervention
23 mai 2007

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...
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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
*/
Messages postés
12
Date d'inscription
lundi 2 avril 2007
Statut
Membre
Dernière intervention
23 mai 2007

Merci pour tout Coq :) Je me penche de plus près sur ce soucis de Threading
Messages postés
12
Date d'inscription
lundi 2 avril 2007
Statut
Membre
Dernière intervention
23 mai 2007

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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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
*/