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