2012-04-12 64 views
1

在我们的应用程序中,我们有一个连接到多个客户端的服务器。供您参考,它是单线程应用程序。每当客户想要发送一些消息给其他客户时,它就会通过服务器。每当客户端向服务器发送消息时,它都会将消息存储到Dqueue中。服务器将从Dqueue中逐一提取消息,它将调用select()并检查消息应该发送到的通道是否可用。如果是,它将发送,否则它会将其插入后面,以便我们可以处理其他消息。但是,这种方法的问题是,假设客户端C1发送两条消息S1S2。现在,当服务器尝试将S1发送到其他客户端C2时,C2因此忙于将消息S1推入队列的后面。现在假设在处理S2时,客户端C2已准备就绪。因此服务器现在可以发送S2。但问题在于消息将以相反顺序到达C2S2S1)。需要适当的数据结构来处理来自多个客户端的消息

您能否建议哪些数据结构应该适用于此,以便我们可以保持相同的消息顺序?

+1

在从出列队列中拉出消息之前,是否可以检查C2是否忙? – 2012-04-12 17:18:04

+1

我们可以这样做,但实际上我们不能无限期地等待发送消息。直到套接字处于忙碌状态时,我们希望为其他所有免费客户端处理其他消息 – user382541 2012-04-12 17:46:32

+0

系统中是否存在内存限制或者您可以奢侈地使用内存?哪一个对你更重要?时间还是空间? – 2012-04-12 17:51:16

回答

1

不要使用单个队列来处理所有消息。每个客户端都需要自己的个人队列。当消息到达时,确定它的目标客户端,并将消息放在该客户端队列的末尾。然后更新您的服务器逻辑,仅将给定客户端队列中的顶部消息发送到该客户端。如果客户端很忙,不要发送最上面的消息。如果客户端已准备就绪,请发送顶部消息并将其从该客户端队列中移除。

+0

但是它在同一个线程中。所以你如何建议处理队列。假设我有5个客户。因此,我将创建5个队列。如果一个客户忙或不忙,那么检查一个客户端并不是一个好主意。那么有没有什么最佳的方法来了解它。我知道select可以返回免费客户端列表。但是,我们如何一次性向这些客户端发送消息 – user382541 2012-04-13 12:01:52

+1

您可以在'select()'的单个调用中指定多个客户端套接字。它可以告诉你哪些客户端是可写的。然后你可以检查这些客户端的队列,并发送()任何正在等待的消息。既然你在单线程中做所有事情(为什么?),你必须使用非阻塞或异步套接字调用,在这种情况下,你可以同时运行多个发送操作。如果你在Windows上,最好通过OVERLAPPED结构或I/O完成端口使用异步I/O,这样你就可以真正地并行地运行多个套接字调用。 – 2012-04-13 18:17:38

+0

Remy是的,我们只使用非阻塞套接字,而且平台是unix。所以你的意思是说我可以通过SELECT迭代所有的套接字描述符,然后从该描述符的dqueue中取出元素,然后发送它。 – user382541 2012-04-14 18:36:57

0

我假设一堆东西。也就是说,您或您组中的某个人将编写队列管理器,或者队列管理器可以接受您创建的参数。

非亲爱的,这听起来像你需要一个结构数组。根据您认为使用该服务的客户数量,它可以是固定的结构数组或堆分配的内存块。根据您想要如何管理客户端,结构数组可以使用指向结构的指针,或者可以为结构分配足够的存储空间。

我不知道你想存储什么数据作为发送消息的一部分。也许如果你写下字段,这将有所帮助。

+0

其实我们需要DS,因为当服务器收到消息时,它将首先存储到DS中。然后它会处理DS将消息发送到指定的客户端。假设它无法在有限的时间内发送消息,它会将其推回DS,以便它可以处理DS中的其他消息。 – user382541 2012-04-12 17:43:19

+0

我不确定你在说什么。你的意思是你必须写一个DS? – octopusgrabbus 2012-04-12 17:46:53

+0

现在我们正在使用Deque来达到这个目的。但是正如我在上面提到的那样,它的问题是它改变了消息的顺序。所以我想知道什么是正确的数据结构来处理消息 – user382541 2012-04-12 17:50:08

相关问题