c++ 与特定客户端 Boost asio 通信

c++ communicate with specific client Boost asio

我是 c++ 的新手,我开始用 boost 编写我的服务器代码。我在网络和官方文档上遵循了很多示例。但我对此一无所知(也许我没有问好问题)-> 与特定客户沟通。我的意思是->

老问题:

Server launch and wait for connection-> client(1) connect through TCP-> server accept client and start async_read

Let's say 3 clients also connect->

How I'll tell to my server too write too client(2) or (3) but not both?

我表达不好

新问题:

我的服务器工作正常,当客户端将数据发送到服务器(Unreal engine 4 中的自定义客户端)时,他可以读取数据然后毫无问题地写回我的客户端。我寻找一种无需他发送数据即可与我想要的客户交谈的方式。示例:

客户端1写入服务器->数据发送到服务器启动下一个动作->写入特定客户端。

更具体的例子:

客户端 1 想向客户端 10 发送请求,因此客户端 1 向服务器写入操作 «action, id client» (request, 10) 然后服务器知道他需要与客户端 10 交谈并发送请求。

我的问题不在客户端,而是在服务器端。

我相信这很容易,我只是不明白一些基本的东西,如果有人能给我一个方向、一个例子或简单的解释,我将不胜感激。感谢未来的回答。

编辑:

如果有人像我一样遇到困难(我知道这很容易,但我们永远不知道 :p,也许它可以帮助某人)这里是答案。

我将其包含在我用来连接、写入、发送等的文件中

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

我设置了->

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

使用套接字->

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

问题解决!感谢您的帮助!

每次您的服务器程序执行 accept 时,它都会在另一端获得一个带有新客户端的新套接字。

通常的做法是使用这个新套接字创建和初始化某种对象。然后你将该对象放入某种结构中。像集合、地图、向量、列表,任何东西 真的。

当您需要特定客户端时,请在该数据结构中搜索它。如果您使用地图或 unordered_map 那么您可以通过您使用的任何键快速获取它。

现在您有了客户端对象,您可以在其上调用方法。就像您自己的 "send" 版本一样,可以将其添加到 per-client 缓冲区。由于在 Boost ASIO 中消息发送是异步的(它的名字就在那里)你知道你可能无法立即发送它。

Boost ASIO 聊天示例应用程序在这方面做得很好。

看看量子物理学家评论的link。特别是这个:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp