Socket (serveur)

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

YOYO, @+.
YOYO

11 réponses

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

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

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

YOYO, @+.
YOYO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
19 févr. 2006 à 12:04
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
19 févr. 2006 à 16:34
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().
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
19 févr. 2006 à 16:43
Tu veux dire exploiter les événements FD_CLOSE, FD_READ etc... ?

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

YOYO, @+.
YOYO
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
19 févr. 2006 à 19:45
Salut,

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

YOYO, @+.
YOYO
0