MaitreZ
Messages postés8Date d'inscriptionjeudi 12 février 2009StatutMembreDernière intervention21 novembre 2003
-
4 nov. 2003 à 11:54
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 mai 2011
-
22 juin 2004 à 14:38
Bonjour à tous,
je suis en train de créer une appli client et une appli serveur. L'appli client est un jeu qui représente pour l'instant une petite voiture. Elle se connecte sur le serveur, et lorsqu'il y a deux clients connectés, ils se voient mutuellement.
Mon problème est que les envois de coordonnées d'un client à l'autre (en passant par le serveur) est tres lent. Le client 1 envoit ses coordonnées au serveur qui lui, renvoit tout ça au client 2.
Pour faire l'application serveur, je suis parti d'un prog que j'ai trouvé sur cppfrance (lanchat je crois). En cherchant un peu d'où mes problèmes pouvaient venir, j'ai compris qu'il créait un thread par client connecté. Je voudrais savoir si c'est une bonne méthode, ou s'il vaut mieux uniquement créer un seul thread qui servira à écouter. D'où un deuxième question: Lorsque plusieurs clients envoient énormément d'infos au serveur, peut-on être sûr qu'il traitera tous les messages reçus, meme s'il prends du retard dans son traitement?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 4 nov. 2003 à 18:01
Salut,
Elle remplacent rien, c'est juste des modeles d'utilisation de winsock.
Select(...) te permet de gerer plusieurs clients dans un seul thread, et apres reflexion je me suis dit comme Anacrox que c'etait la meilleure solution a ton probleme (car ca marche bien et assez simple a utiliser).
WSAAsyncSelect(...) est bien pour faire des clients avec interface graphique, mais rien de plus (avis perso).
WSAEventSelect(...) te permet de faire comme select, mais c'est plus compliqué (avec de meilleures performances bien entendu).
Y'en a d'autres encore, mais j'en parle pas car je les connais pas trop.
Vous n’avez pas trouvé la réponse que vous recherchez ?
MaitreZ
Messages postés8Date d'inscriptionjeudi 12 février 2009StatutMembreDernière intervention21 novembre 2003 4 nov. 2003 à 23:30
Hello,
merci pour la précision. Par contre, je recherche quand meme la performance, même si je dois passer un peu plus de temps à comprendre comment ça fonctionne. C'est beaucoup plus complexe ou ça se comprend bien quand même?
Autre chose, mes clients sont avec des interfaces graphiques puisqu'il s'agit d'un jeu qui se connecte à un serveur online.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 4 nov. 2003 à 23:57
Salut,
Niveau performance, si tu as peu (<100) de client tu verra pas la difference entre les 2.
WSAEventSelect(...) utilise des threads, select(...) pas obligatoirement. Pour moi le choix est vite fait quand on connait les problemes que les threads peuvent poser.
Sinon, un truc completement a part, c'est que le protocol UDP est plus rapide que TCP, et comme tu ne va envoyer que des coordonnées de temp en temp je pense que c'est plus adapté (avis perso).
MaitreZ
Messages postés8Date d'inscriptionjeudi 12 février 2009StatutMembreDernière intervention21 novembre 2003 5 nov. 2003 à 12:45
Re,
ok pour la première partie de ton post... en fait, à terme il devrait y avoir plus de 100 clients... Enfin, dans un premier temps, ça peut largement suffir.
Par contre, pour la deuxieme partie, le protocole UDP est bien en non-connecté, c'est ça?
Le truc, c'est que le jeu envoi sans cesse au client des tas de choses, les coordonnées sont sans cesse changeantes... donc chaque client envoi beaucoup de données au serveur et lui-meme renvoit à beaucoup de clients... alors? UDP ou TCP ? that is the question ;)
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 5 nov. 2003 à 13:35
Salut,
UDP est non connecté en effet, c'est a dire moins securisé mais legerement plus rapide (pas de connexion a établir, pas d'accusé de reception, etc...).
MaitreZ
Messages postés8Date d'inscriptionjeudi 12 février 2009StatutMembreDernière intervention21 novembre 2003 5 nov. 2003 à 14:02
Ouaip, mais il me semblait que les jeux étaient plutot basés sur du tcp plutot que de l'udp...
Je te remercie pour tous ces détails, je vais essayer de partir sur le Select (ou p-e le WSAEventSelect). J'espère que je trouverai des exemples d'utilisation de ces fonctions, et que je pourrai adapter mon prog en conséquences...
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 mai 2011 21 juin 2004 à 17:04
Salut aardman
Juste une petite question:
Si on utilise WSAAsyncSelect (..), pas besoin d'utiliser les threads ???
En fait, je developpe une appli client serveur TCP/UDP.
J'ai un serveur et n clients. Jusqu'à present je gerais mes socket tout simplement.
Mais j'ai eu un pb lorsque j'ai voulu renvoyer un message au client depuis le serveur (le traitement sont faits dans des threads) apres que le client ait envoyé sa requete. Le recv (au niveau du client) me renvoyait une erreur (10054).
J'ai donc cherché, et j'ai vu que c'etait un pb de synchro.
Je cherche donc a utiliser la méthode WSAAsyncSelect .
J'ai bcp de mal a comprendre comment l'utiliser.
Peux tu m'eclairer stp ??
Et est ce adapté à ce que je veux faire ?
merci bcp !
Valoue
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 21 juin 2004 à 19:19
Salut,
En effet, avec WSAAsyncSelect() pas besoin de thread.
Les traitements doivent etre fait lors de la reception du message windows lié aux evenements sockets (celui que tu passe en argument a WSAAsyncSelect(...).
Je peux pas te donner d'exemple vu que ca fait plusieurs mois que je code plus.
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 mai 2011 22 juin 2004 à 08:30
Juste une petite question:
En fait je n'ai pas du tout d'interface graphique.
Je vois que tu avais ecrit un peu plus haut:
"Select(...) te permet de gerer plusieurs clients dans un seul thread, et apres reflexion je me suis dit comme Anacrox que c'etait la meilleure solution a ton probleme (car ca marche bien et assez simple a utiliser).
WSAAsyncSelect(...) est bien pour faire des clients avec interface graphique, mais rien de plus (avis perso).
WSAEventSelect(...) te permet de faire comme select, mais c'est plus compliqué (avec de meilleures performances bien entendu)."
Pour ce que je veux faire, mieux vaut donc utiliser Select ou WSAEventSelect, c ça ?
Et là dois je utiliser les thread ?
Actuellement, mon serveur accepte les demandes de connexion, et créé ensuite un thread afin de gérer les demandes du client.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 22 juin 2004 à 13:42
Salut,
Oui,WSAAsyncSelect() s'utilise uniquement avec une fenetre.
Les evenements sockets sont alors notifiés via des messages windows.
Si tu n'en a pas, effectivement que Select ou WSAEventSelect() serait plus adapté.
Avec Select(...) tu n'as pas besoin de faire d'autre threads.
Avec WSAEventSelect(...) il faut plusieurs threads (un deuxieme en fait).
La solution ou a chaque connexion tu lance un thread est a mon avis la moins bonne.