1

我在这里陷入了一个非常混乱的境地,因此,我将解释整个场景。

我开发了一个 UDP 服务器/多客户端应用程序。

服务器有一个主接收线程。每个想要与服务器通信的客户端首先向服务器发送一个带有一些 ID 的消息。服务器从客户端接收此消息。服务器有一个包含授权 ID 列表的文本文件。当从客户端接收到消息时,服务器将从客户端接收到的 ID 与其文本文件中可用的 ID 进行比较。如果客户端的 ID 与服务器文本文件中的任何 ID 匹配,则认为该客户端已通过身份验证,并为该客户端创建一个新线程和一个新套接字。这个新客户端的信息也在包含所有活动客户端信息的队列中更新。

现在所有这些任务都完成了现在的问题是,由于每个客户端都有一个专用线程为其服务​​,我希望这些线程向它们各自的客户端发送一些消息并等待客户端的响应,如果没有收到来自客户端的响应客户端在特定时间内,客户端被认为是死的,并从主接收线程中的队列中删除。

但问题是“所有”x 个客户端如何告诉主接收线程他们各自的客户端处于非活动状态?如果这部分完成了,主Receiving Thread会不会要遍历整个Queue,找出client的死信息,然后如何删除呢?这对我来说真是令人困惑。

已经很久了,但我无法在我的应用程序中记录活跃的客户。

请尽快帮助我。提前致谢 :)

编辑: 另一个想法可能是队列有 x 个元素和每个客户端的状态。例如:最初对于 x 个客户:

Client#    Status

1            0

2            0

3            0

.            .

.            .

.            .

.            .

x            0

每当新客户端变为活动状态时,状态就会从 0 更改为 1,而每当客户端出现故障时,状态就会从 1 更改回 0。

这似乎是正确的方法吗?

4

1 回答 1

2

我最好建议你使用 Tcp 。使用 UDP 你有义务自己做事。

我希望这些线程向它们各自的客户端发送一些消息并等待客户端的响应

第一:使队列或列表线程安全

传递您存储有关客户端地址 (client sockaddr) 和其他信息(如 state )信息的 List 的 id(索引)。在线程内部并使用索引获取有关客户端的信息。获取客户端地址,您可以向其发送消息。

如果这部分完成了,主Receiving Thread会不会要遍历整个Queue,找出client的死信息,然后如何删除呢?这对我来说真是令人困惑。

您将遍历列表并获取客户端的索引并更改状态。在客户端线程中,当您看到客户端状态在特定时间内未更改为活动时,您将从列表或队列中删除该客户端信息。

快乐编程

于 2013-06-10T06:55:47.190 回答