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

SpecialCharacter 12 Messages postés lundi 2 avril 2007Date d'inscription 23 mai 2007 Dernière intervention - 6 mai 2007 à 11:10 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 mai 2007 à 12:31
3
Merci
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
*/

Merci cs_coq 3

codes-sources a aidé 80 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 mai 2007 à 11:39
0
Merci
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
*/
Commenter la réponse de cs_coq
SpecialCharacter 12 Messages postés lundi 2 avril 2007Date d'inscription 23 mai 2007 Dernière intervention - 6 mai 2007 à 11:45
0
Merci
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
Commenter la réponse de SpecialCharacter
SpecialCharacter 12 Messages postés lundi 2 avril 2007Date d'inscription 23 mai 2007 Dernière intervention - 6 mai 2007 à 12:04
0
Merci
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...
Commenter la réponse de SpecialCharacter
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 mai 2007 à 12:36
0
Merci
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
*/
Commenter la réponse de cs_coq
SpecialCharacter 12 Messages postés lundi 2 avril 2007Date d'inscription 23 mai 2007 Dernière intervention - 6 mai 2007 à 12:49
0
Merci
Merci pour tout Coq :) Je me penche de plus près sur ce soucis de Threading
Commenter la réponse de SpecialCharacter
SpecialCharacter 12 Messages postés lundi 2 avril 2007Date d'inscription 23 mai 2007 Dernière intervention - 6 mai 2007 à 12:58
0
Merci
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.
Commenter la réponse de SpecialCharacter
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 mai 2007 à 13:07
0
Merci
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
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.