[c++] multi-Socket client/serveur

multi-Socket client/serveur [c++] - C++ - Programmation

Marsh Posté le 15-12-2009 à 23:00:35    

Bonsoir,
 
J'utilise Qt pour coder mon appli, mais ems questions sont d'ordre generales.
 
je suis en train de faire une application réseaux. J'ai un TcpServer qui ecoute sur le port 6666 les nouvelle connexions et crée un socket. Il donne ensuite ce socket a un nouveau thread "serveur" pour communiqer avec le client.
J'ai donc 1 client = 1 thread "serveur".
Or je m'en viens a me poser la question suivant.
Mes sockets sont connecté sur qu'elles port ? Est-ce le 6666 pour tous (coté serveur) ? Est-ce possible, car j'ai cru comprendre que 1 port = socket maxi...
Et pour mon serveur, il communique sur le port fournit par le client je suppose ?
en faisant Tcpdump, je crois voir que le client communique depuis un port X et le serveur lui répond depuis le 6666 meme depuis mon thread...Donc soit c'est le Tcpserveur qui dispatch en interne les donnée (??) sois je sais pas trop en faite.
 
 
Je me pose c'est question car maintenant je veux faire mon application en UDP,  or il n'y a pas UdpServer pour "listen" les nouvelles connexions. Puisque l'on travail en mode non connecté.
Est-ce que je peux alors faire comme pour mon TCP, 1thread par client, juste en lui donnant le socket nouvellement crée? Je suppose que non. Y a t'il des mécanisme intégré a Qt ? sinon, pensez vous que le mieux serait de mettre un "serveur" sur un port (6006 par exemple) qui crée juste les thread serveur. Ensuite chaque thread serveur est sur un port différent, et communique au client sur qu'elle port communiquer ?
 
Comment faire une application serveur UDP (TCP aussi par exemple mais je veux UDP) qui accepte plusieur client a  la fois, sur le meme port? Et-ce que c'est possible, ou le port identique c'ets juste pour se signaliser et recevoir le nouveau port propre a chaque client?
Est-ce que l'on peut avoir 2 socket sur le meme port ?(comment fait par exemples SSH/FTP/TELNET etc?)
 
Merci d'avance au âme charitable pouvant m'éclairer sur tout ca.

Reply

Marsh Posté le 15-12-2009 à 23:00:35   

Reply

Marsh Posté le 16-12-2009 à 01:10:07    

Je n'ai pas la réponse à toutes tes questions (du moins je ne suis pas sur de moi et mieux vaut fermer sa gueule que de mettre quelqu'un sur une mauvaise piste). Donc je ne réponds pas à toutes, il y aura bien quelqu'un qui sait qui passera.
Pour l'UDP, tu crées une socket et tu utilises  
 
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
                        struct sockaddr *from, socklen_t *fromlen);
 
Tous les clients envoient au même "endroit", tu reçois tout de la même façon puis tu identifies les clients grace à la structure from qui est remplie avec les infos du client au retour de la fonction. Ensuite quand tu as identifié le client rien ne t'empêches d'envoyer ce que tu viens de recevoir à un autre thread ou processus (qui correspond au client en question) via un pipe par exemple.
 
Je pense que SSH crée une socket tcp puis utilise accept exactement comme toi pour chaque client. 1 client = 1 thread (à moins que ce ne soit une boucle qui balaye tous les clients mais je ne vois pas l'intêret).
 


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 16-12-2009 à 07:00:30    

de tête, y a un exemple de client serveur correct dans Boost.ASIO

Reply

Marsh Posté le 16-12-2009 à 09:53:32    

Ah oui j'étais en C moi...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-12-2009 à 00:55:38    

Ok de toute facon C/C++ ou java et nimorte..les socket, ca marche pareil.
Donc ouai, faire un serveur qui dispatch les donnée au "bon" serveur.
Je peux par exemples mettre une info dans l'entete du message qui stipule a quelle client c'est destiné? (mais ca m'a l'air bof niveau sécurité ca)
quelle serait la meilleur solution a votre avis (pour UDP garder le principe 1clinet =1 threead serveur)

Reply

Marsh Posté le 17-12-2009 à 10:39:26    

Joel F a écrit :

de tête, y a un exemple de client serveur correct dans Boost.ASIO



---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-12-2009 à 15:10:29    

Oui je l'ai deja vu plein de fois, puisque j'ai meme fait mon appli aussi avec boost.asio en TCP
Mais la, dans l'exemple en UDP, je vosi pas comment faire pour faire  1client = 1serveur (thread).
 
Deja esce que vous me confirmer que 1 port = 1 unique socket ?

Reply

Marsh Posté le 17-12-2009 à 16:39:24    

En UDP, je n'ai toujours utilisé qu'une socket. Après rien ne t'empêche de l'utiliser dans plusieurs thread avec un mutex pour éviter de faire du caca.


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed