P2P avec WSAasyncselect [Résolu]

Signaler
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
JoebarGlut
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
Salut,
je suis en train de realiser un petit systeme p2p et pour ca j'ai un serveur dedié DS, un client C1 et un client C2 qui ont le meme code.
C1 et C2 se connectent au port 4200 du DS.
Ensuite suivant ce qu'aura décidé le serveur dédié ce sera soit C1 soit C2 qui se connecteront l'un a l'autre.
Pour ca mes clients se connectent entre eux sur le port 4300.
J'utilise alors WSAAsyncSelect(sock_client, hwnd, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE); pour ma connection au serveur et pour mes clients c'est WM_SOCKET2.
Ainsi je gere les paquets différament et c'est plus clair.
Est-ce une bonne démarche ? N'y aura t il pas de conflits dans les messages ? y a t il d'autres methodes sachant que je n'ai qu'une fenetre dans mon programme ?

5 réponses

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

En fait quand tu recois un message WM_SOCKET ou WM_SOCKET2, le wParam
est le socket qui a généré cet évenement, donc il n'y a aucune
ambiguité pour savoir de quelle connection l'event provient. On peut
donc gerer plusieurs dizaines de socket avec un seul message, mais
c'est vrai qu'utiliser plusieurs messages c'est plus pratique.



Pour info, eMule utilise WSAAsyncSelect(), et gere plusieurs centaines
de socket sans probleme. Un point interessant, c'est que chaque socket
possede son propre message de notification, pour des raisons pratiques.
Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014

Comme c'est un client P2P, pour transférer des fichiers je suposes tu devrais peut-être regarder du côté des threads puisque chaque client demandera une ressource gourmande. Malheureusement, il n'y semble pas avoir beaucoup d'expert dans la matière. Des sockets blocant serait peut-être approprié.

Bonne prog.

http://vbaddons.free.fr

if (CPossible)
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

Non ce n'est pas un P2P gourmand (8 personnes, pour commencer et ca ira maximum a 16) et chaques clients fait au maximum deux connection (la connection permanante avec les DS) et une conection/deconnection de temps en temps avec un client.
Ce qui demande beaucoup de ressources c'est le nombre de connections, ici avec 2, je pense que les WSA feront bien l'affaire.
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

Je vais reformuler ma question differement :
Est-ce qu'il est possible de faire 2 appel : 1 à connect() et 1 accept() ou ou 2 connect() (non-bloquant) avec wsasyncselect en utilisant comme parametre WM_SOCKET pour les messages entre client-serveur et WM_SOCKET2 pour les messages client-client ?
lorsque du cote client je recevrais F_READ, de WM_SOCKET je saurais alors que ca viens du serveur. Idem WM_SOCKET2 pour client.
Quelqu'un a t il deja fait ca, est-ce la procedure ideale ? ou existe il un autre moyen sans passer par les trhread si possible.
Au pire je teste demain mais comme je n'ai qu'une machine, deja que c'est tordu alors si en plus je fais du multiconnect sur la meme ip :D
merci.
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

En effet, pas d'ambiguités, j'ai testé et ca fonctionne impecable !
Je pensais que WSAAsyncSelect aurais du mal a se lancer deux fois de suite sur le meme handle mais en fait aucun problemes :)
Je savais pas pour emule, ca me donne des ailes :p
merci pour la reponse, encore :D