-
CAsyncSocket
bonjour,
je suis en train de développer une application Clients/Serveur en utilisant MFC et CAsyncSocket.
J'aimerai savoir si CAsyncSocket est approprié pour gérer plusieurs Clients qui pourraient émettre des requetes simultanément ( enfin presque ) sur un même serveur. Comment cela est-il géré?
J'ai étudié la documentation de microsoft mais ce n'est pas très clair...
Merci
-
Ah, la classe CAsyncSocket, (ou al fonction WSAAsyncSelect() pour les non-MFC), c'est carrément une nouvelle façon de programmer un serveur.
Pour le programmeur, c'est comme si l'application restait mono-threadée (même si en interne, un thread supplémentaire est créé, de manière transparente et on n'est pas censé y avoir accès).
CAsyncSocket, permet de transformer en événement tout ce qui se passe sur le réseau. Sur un socket d'attente de serveur par exemple, la fonction OnAccept() (événement FD_ACCEPT) est appelée chaque fois qu'un client tente de se connecter, et c'est au programmeur de faire appel à Accept() dans la fonction, créant ainsi un nouveau CAsyncSocket, pour le socket de travail cette fois-ci.
Ainsi, le programme ne passe pas son temps à boucler sur un accept() bloquant : le accept() n'est appelé que quand un client se connecte.
Pour les sockets de travail, c'est la même chose, mais on gère généralement les événtments FD_READ et FD_CLOSE : onReceive() est appelé automatiquement quand des données sont présentes, et le serveur n'a plus qu'à faire un read() pour les obtenir, les traiter, répondre et rendre la main.
Typiquement, en CAsyncSocket, le serveur supporte N clients simultanément connectés, et chaque requête est transformée en événement: Les requètes sont donc traitées l'une après l'autre par le serveur, même si deux sont envoyées simultanéments : elles seront dans la file d'événements du thread, et seront traitées une à la fois.
Si tu veux en savoir plus sur la façon dont cela est géré en interne, regarde un peu du coté de la doc de WSAAsyncSelect() : tout est transformé en message Windows.
-
ahh je te remercie pour ces éclaircissements. Donc si j'ai bien compris, pas besoin de thread tout est géré. Apres tout depend de mon code sur OnReceive.
Merci :D