Socket (serveur)

Résolu
Signaler
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
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.

YOYO, @+.
YOYO

11 réponses

Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
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...

Bonne journée @+
Messages postés
146
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
8 mars 2008
2
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.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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?

YOYO, @+.
YOYO
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Pardon sans le "closesocket(TempSockConv);" sinon ça coupe la connexion tout de suite.LOL

YOYO, @+.
YOYO
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Merci à vous deux.
Grâce à vous je pense que j'ai de quoi faire maintenant.
J'essaye tout ça et je vous tiens au courant.

YOYO, @+.
YOYO
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

1 thread par client, c'est peut etre performant sous linux, mais c'est loin d'etre le cas sous windows.

Moi je te conseille plutot d'utiliser les socket asynchrones, cad WSAAsyncSelect() ou WSAEventSelect().
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Tu veux dire exploiter les événements FD_CLOSE, FD_READ etc... ?

YOYO, @+.
YOYO
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
oui
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Ok mais ça risque pas d'avoir du mal avec un transfert de fichier ?

YOYO, @+.
YOYO
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

WSAAsyncSelect() c'est ce qui est utilisé eMule, donc niveau transfert de fichier c'est plus que correct.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
LOL ! Ah oui vu comme ça !
Assez convainquant comme exemple.
Merci Aardman.

YOYO, @+.
YOYO