cs_JRB
Messages postés28Date d'inscriptionsamedi 21 juin 2003StatutMembreDernière intervention23 mai 2004
-
6 avril 2004 à 22:07
cs_JRB
Messages postés28Date d'inscriptionsamedi 21 juin 2003StatutMembreDernière intervention23 mai 2004
-
7 avril 2004 à 20:18
j'ai esseye de creer un programme de chat ou l'on peut dialoguer a plusieurs mais j'ai rencontre des problemes lorsque j'essaie de l'etendre a plus de 2 communicants.
le programme fonctionne correctement tant qu'il n'y a qu'un seul client mais il plante lorsqu'un deuxieme essaie de se connecter et je ne comprend vraiment pas pourquoi.
voici le code qui gere les connections :
void CReseauDlg::OnAccept()
{
CString strTemp;
char Traduction[12];
int b = 0;
if (!ConnectionEtablie)
b = NuConnection;
// Accepter la connexion
m_ServerSocket.Accept(m_ClientSocket[b]);
// Activer les contrôles correspondants
GetDlgItem(IDC_TEXTE)->EnableWindow(true);
GetDlgItem(IDC_EXPEDIER)->EnableWindow(true);
GetDlgItem(IDC_ENVOYER)->EnableWindow(true);
m_bConnectionEstablished=true;
if (b == 0)
{
NuConnection++;
ConnectionEtablie = false;
itoa(NuConnection,Traduction,10);
strTemp = Traduction;
// Se procurer la longueur de la chaîne
int nSize = strTemp.GetLength();
// Envoyer la chaîne
int nResult = m_ClientSocket[b].Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ?
if (SOCKET_ERROR == nResult)
{
// Oui, afficher message
MessageBox("Erreur lors de l'envoi du texte !");
}
else
{
// Non, ajouter le texte à la ListBox
m_ctrlTexte.AddString(strTemp);
}
}
else
{
b = -1;
itoa(b,Traduction,10);
strTemp = Traduction;
// Se procurer la longueur de la chaîne
int nSize = strTemp.GetLength();
// Envoyer la chaîne
int nResult = m_ClientSocket[NuConnection].Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ?
if (SOCKET_ERROR == nResult)
{
// Oui, afficher message
MessageBox("Erreur lors de l'envoi du texte !");
}
else
{
// Non, ajouter le texte à la ListBox
m_ctrlTexte.AddString(strTemp);
}
b = 0;
ConnectionEtablie = true;
}
}
void CReseauDlg::OnConnect()
{
// Activer les contrôles correspondants
GetDlgItem(IDC_TEXTE)->EnableWindow(true);
GetDlgItem(IDC_EXPEDIER)->EnableWindow(true);
GetDlgItem(IDC_ENVOYER)->EnableWindow(true);
// Créer les variables locales
char pText[1024];
CString strTemp;
// Recevoir la chaîne
int nResult = m_ClientSocket[NuConnection].Receive(pText, 1024);
// une erreur s'est-elle produite ?
if (SOCKET_ERROR == nResult)
{
// Oui, afficher un message
MessageBox ("Erreur à la réception du texte !");
}
else
{
// Ajouter un NULL à la chaîne reçu (désigne
// la fin de la chaîne)
pText[nResult]=NULL;
// Copier le text dans la variable CString
strTemp = pText;
// Ajouter le texte à la ListBox
m_ctrlTexte.AddString(strTemp);
if (strTemp != "-1")
{
NuConnection = 0;
OnClose();
NuConnection = atoi(strTemp);
OnConnexion();
}
}
}
void CReseauDlg::OnEnvoyer()
{
// TODO: Add your control notification handler code here
// Se procurer les données actuelles
UpdateData(true);
// Lire la chaîne du contrôle
CString strTemp = m_strExpedier;
// Cette instance est-elle le serveur ?
if (m_blsServeur)
{
// Placer le préfixe
strTemp = "Server: " + strTemp;
}
else
{
// Placer le préfixe
strTemp = "Client: " + strTemp;
}
// Se procurer la longueur de la chaîne
int nSize = strTemp.GetLength();
// Envoyer la chaîne
int nResult = m_ClientSocket[NuConnection].Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ?
if (SOCKET_ERROR == nResult)
{
// Oui, afficher message
MessageBox("Erreur lors de l'envoi du texte !");
}
else
{
// Non, ajouter le texte à la ListBox
m_ctrlTexte.AddString(strTemp);
}
// Actualiser les données des contrôles
UpdateData(false);
}
void CReseauDlg::OnSend()
{
// Méthode intentionnellement vide
}
void CReseauDlg::OnReceive()
{
// Créer les variables locales
char pText[1024];
CString strTemp;
// Recevoir la chaîne
int nResult = m_ClientSocket[NuConnection].Receive(pText, 1024);
// une erreur s'est-elle produite ?
if (SOCKET_ERROR == nResult)
{
// Oui, afficher un message
MessageBox ("Erreur à la réception du texte !");
}
else
{
// Ajouter un NULL à la chaîne reçu (désigne
// la fin de la chaîne)
pText[nResult]=NULL;
// Copier le text dans la variable CString
strTemp = pText;
// Ajouter le texte à la ListBox
m_ctrlTexte.AddString(strTemp);
// Mise à jour de la ListBox
UpdateData(false);
}
}
le serveur cre un socket d'ecoute et attend les arrivees.
le client envoie un message avec m_ClientSocket[0] qui est accepte par le serveur celui ci lui indique combien de client son pr l'instant connecte et lui renvoie un nombre correspondant. le client ferme la connection met le nombre reçu entre ces crochets (m_ClientSocket[x]) et renvoie un demande de connection qui est accepte definitivement.
Jusque ici il n'y a pas de problemes tout se passe comme prevu mais lorsque un deuxieme client tente de se connecter il devrait se passer la meme chose alors que le programme plante avant meme la reception de donne par m_ClientSocket[0]. le plus curieux c'est qu'il me dit pas d'echec a la connection mais une erreur a l'envoie du nombre qui permet de positionner le client.
les variables se trouvent dans le meme etat que pour le client numero un alors je ne vois vraiment pas pourquoi il ne se porduit pas la meme chose
merci a tout ceux qui pourront m'eclairer a ce sujet
PunkDude424
Messages postés117Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention24 avril 2006 6 avril 2004 à 22:18
Pour une connection multiclient tu doit te creer un thread, quand un client se connect, tu démarre le thread, ensuite le main continu découter pour voir si un autre client se connecte, si oui, tu démarre un thread pour se client, et ainsi de suite....