Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在聊天应用程序中,如何在公共场所高效地发送消息_C++_Algorithm_Architecture_Client Server - Fatal编程技术网

C++ 在聊天应用程序中,如何在公共场所高效地发送消息

C++ 在聊天应用程序中,如何在公共场所高效地发送消息,c++,algorithm,architecture,client-server,C++,Algorithm,Architecture,Client Server,我正在创建一个基于服务器/客户端架构的聊天应用程序。服务器和客户端之间的通信是基于TCP的套接字。在这个应用程序中,我创建了不同的公共房间。任何数量的用户都可以加入任何公共房间 现在,当一个公共房间的用户说“XYZ”为该房间发送消息时,我需要将该消息传递给“XYZ”公共房间中的所有人 问题从这里开始。假设公共房间“XYZ”中有1000个用户,每当一个用户在这个房间里发送消息时,我需要将此消息一个接一个地发送到for循环中相应套接字描述符上的其余999人 这是我所知道的唯一的方法,我认为这不是一个

我正在创建一个基于服务器/客户端架构的聊天应用程序。服务器和客户端之间的通信是基于TCP的套接字。在这个应用程序中,我创建了不同的公共房间。任何数量的用户都可以加入任何公共房间

现在,当一个公共房间的用户说“XYZ”为该房间发送消息时,我需要将该消息传递给“XYZ”公共房间中的所有人

问题从这里开始。假设公共房间“XYZ”中有1000个用户,每当一个用户在这个房间里发送消息时,我需要将此消息一个接一个地发送到for循环中相应套接字描述符上的其余999人

这是我所知道的唯一的方法,我认为这不是一个好方法,因为如果用户增加,它会严重影响系统的性能

请在这方面帮助我,向我建议实现同样目标的有效方法


谢谢

据我所知,这是使用流套接字(即TCP,我建议用于(可靠的)聊天)的唯一方法

多播和其他仅适用于UDP等


这也是大型IRC网络拥有多台服务器的原因(除其他外,如冗余等)。然后,接收用户消息的服务器只需将消息分发给其自己的所有用户和网络中的所有服务器,然后再分发给其用户。这减少了单个服务器的负载。

使用pub-sub。客户端订阅聊天室,您只需将消息发布到单个实体-聊天室。

TCP就是这样工作的。你可以用广播地址尝试UDP,但我想就这些。你看过现有系统(如irc)是如何做到这一点的吗?你为什么要这样做?如果你真的这样做,考虑使用现成的解决方案。如果您将此作为练习,您可能希望使用redis之类的工具来实现许多核心功能,至少在您将其替换为自己的东西之前是这样。我如何使用它,因为通信是基于TCP的套接字的。请给我更多的指导。这对解决客户需要通过可靠连接获知新消息的问题有什么帮助?你的基本意思是他应该使用现成的发布/订阅系统吗?@user1457812我的意思不是在网络层上广播,而是在应用层上广播。我更正了我的措辞,改为使用“分发”。对不起,误会了。他们正在做和你一样的事情,但是分布在他们的网络中,这样每个服务器需要向其发送消息的对等点就更少了。谢谢你让我离开。一个简单的问题是,当用户从客户端应用程序登录时,它会发送我的应用程序的域名。现在,如果我在域中使用2台服务器,那么DNS将根据负载平衡分配单个服务器的IP。因此,用户可以在两台服务器中的任何一台中,但两台服务器都知道公共房间。因此很难传播这些信息。如果我在某个地方错了,请纠正我。IRC就是这样做的。服务器彼此认识。如果服务器A收到用户消息,它会将其分发给所有用户和服务器B,包括目标房间C。服务器B知道消息来自服务器A,并将其分发给房间C中的所有用户。