C++ client/server 具有单个消息和广播的应用程序

C++ client/server application with single messages and broadcast

我正在尝试编写一个简单的客户端-服务器应用程序,客户端可以在其中向网络中的一个或所有客户端发送或广播消息。服务器存储所有连接到它的 IP 地址,并在新客户端连接时广播一个新 IP。

我不太确定如何实现向另一个客户端发送单个消息。我是否只需要向服务器发送 TCP 消息并将所需的接收者作为数据放入 TCP 层,然后由服务器提取该数据以便它知道将它发送到哪里?

我还想为消息添加加密,这样服务器就无法再读取数据,所以我不确定如何解决!?

我正在使用 C++ 和 Qt5 来实现

I'm not quite sure how to implement the sending of a single message to another client. Would I just have to send a TCP message to the server and put the desired recipient as data in the TCP layer which is then extracted by the server so it knows where to send it?

在理想情况下,客户端可以直接相互对话,因为它们可以从服务器(通过广播或从服务器请求 IP 地址列表)中找到其他客户端的 IP 地址).如果您的所有客户端都 运行 连接在同一个 LAN 上,那可以正常工作。

假设您希望您的系统 运行 在一般 Internet 上,但是,这不会很好地工作,因为 many/most 客户端将在各种防火墙后面,所以他们不会接受传入的 TCP 连接。 (有一些 ways,但它们需要对 TCP 的工作原理有非常深入的了解,即使那样它们也只能在某些情况下工作,所以我不建议在第一个项目中尝试它们)

因此,对于可靠的客户端->客户端消息传递机制,最好的办法确实是让发送客户端将消息发送到服务器,并附上一些简短的 header 告诉服务器哪个其他客户端(s) 消息应转发至。我的 own client/server 消息传递系统按照这些思路工作,我发现它运行良好。

I also want to add encryption to the messages which would then no longer allow the server to read the data, so I'm not sure how to solve that!?

在基本的 non-encrypted 功能首先运行之前,不要担心添加加密,因为加密会使调试变得更加困难。也就是说,只要前面提到的 header 数据(告诉服务器将消息转发到哪里)未加密(因为服务器需要能够阅读 header 以了解如何处理加密数据)。更棘手的部分是当接收客户端从服务器获取转发的数据时——接收客户端如何知道如何解密它?您需要一些外部机制供客户端共享密钥(对称密钥或 public/private 密钥对),因为如果您通过服务器自己发送加密密钥,那么加密任何东西都没有多大意义(因为服务器可以保留其转发的任何密钥的副本,并在需要时使用它们进行解密)