2017-02-17 1 views
1

Je suis nouveau sur C++ et j'ai commencé à coder mon serveur avec boost. Je suis beaucoup d'exemple sur le web et sur le doc officiel. Mais je n'ai rien trouvé (peut-être que je ne pose pas la bonne question) à propos de ceci-> communiquer avec un client spécifique. Je veux dire par that->c + + communique avec le client spécifique Boost asio

vieille question:

lancement du serveur et attendre connection-> client (1) se connecter via TCP-> serveur accepte client et commencer async_read

Disons que 3 clients se connectent aussi->

Comment vais-je dire à mon serveur aussi écrire trop client (2) ou (3) mais pas les deux?

je me exprime mal

Nouvelle question:

Mon serveur excellent travail, quand envoyer client des données au serveur (client personnalisé dans le moteur Unreal 4) il peut le lire puis écrire retour à mon client sans problème. Je cherche un moyen de parler au client que je veux sans avoir besoin d'envoyer des données. Exemple:

client 1 écrire sur le serveur-> les données envoyées au serveur lancent l'action suivante-> écrire sur un client spécifique.

exemple plus précis:

Client 1 voulez envoyer la demande au client 10, si le client 1 écriture au serveur l'action «l'action, id client» (demande, 10), le serveur sait qu'il faut parlez au client 10 et envoyez la demande.

Mon problème n'est pas côté client, mais côté serveur.

Je suis sûr que c'est assez facile et je ne comprends tout simplement pas certaines choses de base, si quelqu'un pouvait me donner une direction, un exemple ou simplement une explication, il serait apprécié. Merci pour votre réponse future.

EDIT:

Si quelqu'un a du mal comme moi (je sais qu'il est facile, mais on ne sait jamais: p, peut-être il pourrait aider quelqu'un) ici la réponse.

j'inclure ce dans le fichier où je l'utilise pour se connecter, écrire, envoyer, etc.

std::map<int, tcp::socket> playerRemote; 

Je mets IT->

playerRemote.insert(std::pair<int, tcp::socket>(id, std::move(socket_))); 

utiliser le socket->

boost::asio::async_read(playerRemote.at(id_to_use) 

Question résolue! Merci pour l'aide!

+0

Dude ... des exemples à ce sujet sont PARTOUT! Regardez ici: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_examples.html –

+1

Quel est le problème? Si vous avez trois sockets acceptées, stockées et attendent de recevoir des données via 'async_read', vous pouvez simplement appeler' write' ou 'async_write' sur le socket connecté à un client particulier. –

+0

Si vous souhaitez envoyer des données à des clients spécifiques, vous pouvez les stocker dans, par exemple, un 'std :: map' avec l'adresse IPv4/6 ou un nom [...] et envoyer les données ... comme aussi simple que cela. – Blacktempel

Répondre

1

Chaque fois que votre programme serveur a fait un accept il a obtenu un nouveau socket avec un nouveau client à l'autre extrémité.

La pratique habituelle est d'avoir un type d'objet que vous créez et initialisez avec ce nouveau socket. Et puis vous mettez cet objet dans une sorte de structure. Comme un ensemble, une carte, un vecteur, une liste, quoi que ce soit vraiment.

Lorsque vous voulez un client particulier, recherchez-le dans cette structure de données. Si vous avez utilisé une carte ou unordered_map, vous pouvez l'obtenir rapidement quelle que soit la clé utilisée.

Maintenant que vous avez votre objet client, vous pouvez appeler une méthode dessus. Comme votre propre version de "send" qui peut l'ajouter à un tampon par client. Puisque l'envoi de messages est asynchrone dans Boost ASIO (c'est juste là dans le nom), vous savez que vous ne pourrez peut-être pas l'envoyer immédiatement.

L'exemple de l'exemple de conversation Boost ASIO est bon à ce sujet.

Regardez le lien que The Quantum Physicist a mis dans les commentaires. Surtout celui-ci: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp

+0

merci pour votre réponse! J'essaie déjà de mettre le socket dans une carte, mais cela me donne une erreur. Je vais éditer ma question pour vous faire savoir comment je le fais et quelle erreur, merci encore! – GabrielProL

+0

Je l'ai enfin compris! Je modifie mon message avec la réponse même si c'est une tâche facile, peut-être que quelqu'un l'utilisera. Si vous avez une certaine précision sur la façon dont je l'ai fait, je suis ouvert à toutes les suggestions! merci à tous de partager votre réponse! – GabrielProL