yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
19 févr. 2006 à 11:10
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
19 févr. 2006 à 19:49
Bonjour à tous (et toutes j'espère),
je suis en train d'essayer de faire un serveur de chat avec plusieurs utilisateurs.
Donc pour cela il me faut de nombreuses connexions.
C'est pour ça que je voudrais savoir s'il est possible d'avoir plusieurs connexions sur un même port (en TCP donc).
Si non, comment pourai-je m'y prendre (juste le concept, pour le code je me débrouillerai) pour arriver à gérer un grand nombre d'utilisateurs comme le fait le serveur de MSN par exemple.
Merci d'avance pour votre réponse.
platon179
Messages postés237Date d'inscriptionlundi 20 mai 2002StatutMembreDernière intervention22 juillet 20112 19 févr. 2006 à 11:29
Salut :)
Tu peux en effet avoir plusieurs connections sur le même port, il n'y a aucun souci...
Sinon, pour un grand nombre d'utilisateurs, je pense qu'un serveur parallèle serait le plus adapté. Mais attention : dans ce cas, il te faudra vraiment beaucoup de RAM. Le principe est simple : lorsqu'un client se connecte, tu créées un nouveau processus, qui va gérer ce client et, des que le client se déconnecte, le processus se termine. Tu auras donc un processus principal qui va gérer les nouvelles connections de clients, et qui va créer des fils, un par client.
Si tu utilises un serveur itératif (un seul processus qui gère tous les clients), si tu as beaucoup de connections, les temps de latence risquent d'être plus élevés à mon avis...
MrdJack
Messages postés146Date d'inscriptionjeudi 22 avril 2004StatutMembreDernière intervention 8 mars 20082 19 févr. 2006 à 12:01
perso, je pense qu'il est plus pratique de garder le socket en écoute
sur le port, et quand ya une demande de connexion, tu crées un nouveau
socket qui va apres etre initialisé, accepter la connexion demandée sur
le socket d'ecoute. comme cela, ca ne pose plus le probleme d'avoir le
port deja utilisé lors de la mise en listen du socket d'ecoute.
bref, si tu veux que ca soit tres performant, je te conseille de créer
lors d'une demande de connexion un thread par connexion acceptée en
donnant en parametre l'iddentifiant de la connexion a accepter, puis de
rentrer dans une boucle infinie qui se termine uniquement si la
connexion est coupée.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 19 févr. 2006 à 11:39
Ok merci bcp platon. Tu peux pas savoir comme ça me rassure!!!
Ya juste une petite chose.Quand tu parles de processus, tu veux dire un thread?
Parce que voilà ce que j'ai fait pour l'instant quand une demande de connexion se fait et on dirait que ça déconne :
/*Demande de connexion*/
void DemandeConnexion()
{
SOCKET TempSockConv;
int Taille, i = 0;
while(Connected[i] != 0 && i < 100) i++;
if(i == 100)
{
SendMessage(ListBoxhWnd[1], LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Nombre de connexions maximum atteint !!!");
SendMessage(ListBoxhWnd[1], LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Connexion refusée !");
}
else
{
closesocket(TempSockConv);
Taille = sizeof(PortConv);
TempSockConv = accept(SockConv[i], (SOCKADDR *) &PortConv, &Taille);
shutdown(SockConv[i], SD_SEND);
closesocket(SockConv[i]);
SockConv[i] = TempSockConv;
closesocket(TempSockConv);
Connected[i] = 1;
SockConv[i + 1] = CreerSocket(FenetrehWnd);
Ecouter(i + 1);
i = 0;
}
}
La première connexion est acceptée sans pb, mais quand je demande à un autre socket d'écouter sur le port où la connexion a été faite, ça veut pas écouter.
Est-ce que tu as une idée?