【问题标题】:Creating a basic UDP chat Program in C++用 C++ 创建一个基本的 UDP 聊天程序
【发布时间】:2012-04-05 19:46:08
【问题描述】:

我目前有一个基本的 C++ 聊天程序,它使用 WinSock2.h 和 UDP。目前,用户能够向服务器发送消息,而服务器只是将相同的消息发回。我想知道我从这里去哪里(我不是要代码)。我想知道我应该如何继续将消息发送到另一个也连接到服务器的客户端。

如果我需要解释我已经做了什么,请告诉我。

非常感谢所有建议。

谢谢

【问题讨论】:

  • 你为什么使用UDP?您知道,如果数据包丢失,您可能会丢失部分聊天内容,因为与 TCP 不同,没有传递保证
  • @devshorts 我只是在做一个基本的聊天..如果一个数据包丢失它真的没什么大不了的。我现在只是为了简单

标签: c++ udp client-server chat winsock2


【解决方案1】:

您将拥有一个当前连接的用户列表,当用户发送消息时,它会将其发布给所有连接的用户。

您的服务器将跟踪谁已连接,并删除那些断开连接的人。当有人连接或断开连接时,它会向所有当前连接的用户发送通知,告诉他们这个通知。

所有这些都不是特定于 UDP 的,事实上,对于这种类型的消息传递,TCP 可能会更好,因为您不必担心消息被丢弃。 UDP 仅应在性能至关重要的情况下使用,例如实时游戏、语音聊天。

【讨论】:

  • 所以我正在考虑客户端调用服务器,这将为客户端返回一个 id。我将如何继续拨打这个电话?我正在考虑以与某人发送文本相同的方式发送初始消息,但我认为必须有更好的方式
【解决方案2】:

当您说“已连接”时(在客户端的上下文中)- 您究竟是什么意思?因为你说你在你的程序中使用了 UDP。

在 UDP 协议中没有“已连接”状态,除非您实现它。
然而,在 TCP 协议中,有(在协议本身内实现)。

此外,“广播”消息的基本思想很简单 - 保留已连接客户的列表
连接时添加客户端。断开连接时将其从列表中删除。
然后,当您想向所有人发送消息时,您只需遍历此列表即可。

同样,您必须先接收这些断开/连接事件,然后才能跟踪“已连接”客户端。

如果您使用 TCP 而不是 UDP,那么您已经设置好了。

祝你好运。

【讨论】:

  • 坚持使用 UDP 如何对服务器进行这些调用以将其添加到列表中。现在我只知道发送和接收消息
  • 看,如果您坚持使用 UDP,那么您必须确保服务器保留“已连接”客户端的某个“注册表”。一种方法是让客户端应用程序每 60 秒向服务器发送一条带有代码“我在这里”的消息,以便服务器知道客户端在线。当服务器需要广播一条消息时,它无论如何都会迭代客户端列表,但在实际发送消息之前,它会比较时间并确保每个客户端在过去 60 秒内都发送了“我在这里”消息。有点超时。
【解决方案3】:

基本上,就像 Matthew 所说,您需要存储与服务器的所有当前连接。当套接字连接时,您可以存储对该套接字的引用。现在,每当客户端发送消息时,您都可以将其重新广播到所有套接字。现在您还必须处理套接字断开连接的情况,因为您不想存储一堆已关闭的套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多