guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 2003
-
11 août 2003 à 17:12
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
13 août 2003 à 14:21
... Comment gerer un serveur multiclient sans lancer 1 thread par client.
Quelqu'un peut m'expliquer comment ca fonctionne svp ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 août 2003 à 17:29
Salut,
Il n'y a pas de maniere universelle ca depend du type des sockets que tu utilises.
(1) ton thread principal accepte les connexions,
(2) un autre thread s'occupe de la reception,
(3) un thread qui s'occupe du traitement de ce qu'on a recu.
Quand (2) recois un truc, il lance (3) pour traiter le message.
Du coup (2) retourne presque instantanément a l'ecoute du port et donc il ne loupe pas aucune requetes clientes.
fabiencpp
Messages postés18Date d'inscriptionjeudi 7 août 2003StatutMembreDernière intervention13 août 2003 13 août 2003 à 12:20
Salut,
Ca depend des sockets que tu utilises
Tu es plutôt Socket Windows MFC ou socket classic.
Si tu es plutôt CAsyncSocket des MFC y a pas de thread
tu recois et envoie tes données via des messages windows.
Et chaque client correspond a une nouvelle instant de class
CAsyncSocket (enfin une class a toi qui herite de CAsyncSocket)
Si tu es plutôt Socket Classic.
On se rapproche de la programmation des sockets sous unix
Avec notre bon vieux Select et notre tableau de file descriptor.
Pour simplifier parce que on peut y passé des heures pour t'explique en details.
tu as une boucle d'ecoute qui resemble a ca.
il ya un tableau de socket (autant de case dans le tableau que de client connecter)
fd_set readf;
int biggest_fd;
int i;
while (1)
{
FD_ZERO(&readf); //met readf a zero
FD_SET(sock_listen, &readf); // ajoute la socket d'ecoute a readf
biggest_fd = sock_listen;
for(i = 0, i < nb_connection;i++)
{
if (sock_connect[i] > biggest_fd)
biggest_fd = sock_connect[i];
FD_SET(sock_connect[i],&readf);//on ajoute toutes nos socket client a readf
}
if (select((int)biggest_fd + 1, &readf,
NULL, NULL, timeout) == -1) // attente d'une activité sur l'une des socket contenu dans readf
perror("error");
if (FD_ISSET(sock_listen, &readf)) // si l'activité vient de la socket d'ecoute
accept_connection();
for(i = 0, i < nb_connection;i++)
{
if (FD_ISSET(sock_connect[i], &readf)) // si l'activité viens de la socket client n° i
traitement_reception_client(i);
}
}
Voila c'est juste pour traiter de la recption multiclient
maintenant il faut aussi gerer l'envoie des données avec
le parametre apres readf dans select pour le tablaeu des files descriptors en ecriture.
Il faut aussi gerer un close correct de chaque client
et reindexer le tableau des files descriptor (sock_connect[]) lorsque un client nous quitte.
Voila j'espere que ca pourra t'aider
Mais si tu prog sous win et surtout en MFC je te conseil de
faire l'effort de reagrder les Class sockets MFC car le mecanisme decrit plus haut est transparant sous les MFC
Si tu veux des conseils a ce sujet n'hesite pas
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 13 août 2003 à 14:21
Salut,
C'est une des techniques possibles, mais pas la seule.
Tu peux aussi gerer les sockets sous forme de messages windows, d'events (comme tu viens de decrire), routines I/O, event I/O...
Il y a beaucoup de techniques differentes dans les socket "classiques".