Probleme logique sur une connection multiclients

cs_JRB Messages postés 28 Date d'inscription samedi 21 juin 2003 Statut Membre Dernière intervention 23 mai 2004 - 6 avril 2004 à 22:07
cs_JRB Messages postés 28 Date d'inscription samedi 21 juin 2003 Statut Membre Dernière intervention 23 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

2 réponses

PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 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....
0
cs_JRB Messages postés 28 Date d'inscription samedi 21 juin 2003 Statut Membre Dernière intervention 23 mai 2004
7 avril 2004 à 20:18
ok merci, je connais pas grand chose sur les threads mais je vais esseyer de me renseigner à ce sujet.
0
Rejoignez-nous