begin process at 2012 05 29 21:19:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

probleme logique sur une connection multiclients


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

probleme logique sur une connection multiclients

mardi 6 avril 2004 à 22:07:05 | probleme logique sur une connection multiclients

JRB


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
mardi 6 avril 2004 à 22:18:09 | Re : probleme logique sur une connection multiclients

PunkDude424

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....
mercredi 7 avril 2004 à 20:18:40 | Re : probleme logique sur une connection multiclients

JRB


ok merci, je connais pas grand chose sur les threads mais je vais esseyer de me renseigner à ce sujet.


Cette discussion est classée dans : texte, erreur, chaîne, strtemp, nresult


Répondre à ce message

Sujets en rapport avec ce message

Erreur avec des fonctions externes [ par flopflopp ] Bonjour, j'ai un problème de compilation avec des fonctions externes.J'ai un module ligne.c qui comprend une fonction creation_Ligne déclarée comme ce ecrire sur la deuxieme ligne d'un fichier texte [ par igorpastis ] salut  voila j'ai fait une fonction qui ecrit dans un fichier texte et je voudrais a chaque fois que j'appelle cette fonction ajouter les valeures sur erreur lors de la lecture d'un fichier texte [ par roger81 ] J'aimerais savoir lire un fichier texte mais je narrive pas a faire afficher ces valeurs je code sous visual c++ .net //Création du fichier output.txt erreur de compilation [ par richard97 ] Bonjour  J'ai un projet à faire en C++Voici l'énoncé:SUJET:Pour la création d'entiers arbitrairement grands, l'utilisateur pourra entrer une chaîne (d Petite erreur [ par SeBaZaToR2 ] Bonjour a tous et a toutes J'ai un petit problème. J'essais de trouver pourquoi mais je ne comprends pas. Je me sers du XOR pour coder une chaîne et Message d'erreur [ par goutbouyo ] Salut,Lorsque j'essai de copier du texte dans un fichier ça me met cette erreur : Debug ErrorProgram: ...............R6002-floating point not loadedLe Probleme de liaison [ par vez_from_hell ] bonjourj'ai un gros probleme de liaison dans mon programme et je ne sais pas comme la corriger.(Lieu Erreur) Unresolved external '__fastcall TForm1::F Texte [ par Darking ] Comment fait-on pour écrire sur une ligne précise dans une fenêtre C?Merci! Question newbie format texte <-> hexa [ par Raphy2145 ] Bonjour à tous,Je suis débutant en C++, et c'est pas très glorieux...Je me tourne vers vous parce que je me galère vraiment sur un point de détail que [MFC .NET] Erreur dans wingdi.cpp ligne 92 [ par Atmaweapon ] Bonjour, Je suis en train de développer une application MFC sous .net en Simple Docum


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales