c - 更新队列并从队列中删除所需的内容

标签 c windows multithreading visual-studio-2008 networking

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

我开发了一个 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。

这似乎是正确的做法吗?

最佳答案

我最好建议你使用 Tcp 。使用 UDP 你必须自己做事。

I want these threads to send some message to their respective clients and wait for response from the client

首先:使队列或列表线程安全

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

If this part is done, will the main Receiving Thread have to traverse the whole Queue, find out the client's information which is dead and then how will this be deleted? this is really confusing situation for me.

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

快乐的编程

关于c - 更新队列并从队列中删除所需的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017582/

相关文章:

swift - 以线程安全的方式运行组合链

C 错误数组 : array type has incomplete element type.

使用枚举的 C 宏

linux - 执行脚本后,PowerShell 窗口始终会被清理

.net - 使用 PowerShell 或 VBS 从 HTML 文件中提取表

java - Tyrus 使用每个 websocket 连接多少个线程?

java - 通过管道发送对象

c++ - 程序退出后如何跟踪随机 free() 无效指针?

c - Arduino 是否支持尾调用消除?

windows - 如何在 Windows 上限制进程的 CPU 使用率? (需要代码,而不是应用程序)