Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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_Sockets_Select - Fatal编程技术网

C 需要适当的数据结构来处理来自多个客户端的消息

C 需要适当的数据结构来处理来自多个客户端的消息,c,sockets,select,C,Sockets,Select,在我们的应用程序中,我们有一个连接到多个客户端的服务器。供您参考,它是单线程应用程序。每当一个客户端想要向另一个客户端发送消息时,它都会通过服务器发送。每当客户端向服务器发送消息时,它都会将消息存储到Dqueue中。服务器将从Dqueue中逐个提取消息,并调用select(),检查消息应该发送的频道是否可用。如果是,它将发送,否则它将把它插入后面,以便我们可以处理其他消息。但这种方法的问题是,假设客户端C1发送两条消息S1和S2。现在,当服务器尝试将S1发送到其他客户端C2时,C2正忙,因此它会

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


您能建议什么样的数据结构适用于此,以便我们能够保持相同的消息顺序吗?

我假设有很多事情。也就是说,您或您组中的某个人将编写队列管理器,或者队列管理器可以接受您创建的参数

这听起来像是需要一个结构数组。根据您认为有多少客户端将使用该服务,它可以是一个固定的结构数组或一个已分配的堆内存块。根据您管理客户机的方式,结构数组可以使用指向结构的指针,也可以为结构分配足够的存储空间


我不知道在发送消息时要存储哪些数据。如果你写下字段,也许会有帮助。

我假设有很多事情。也就是说,您或您组中的某个人将编写队列管理器,或者队列管理器可以接受您创建的参数

这听起来像是需要一个结构数组。根据您认为有多少客户端将使用该服务,它可以是一个固定的结构数组或一个已分配的堆内存块。根据您管理客户机的方式,结构数组可以使用指向结构的指针,也可以为结构分配足够的存储空间



我不知道在发送消息时要存储哪些数据。如果您写下字段,可能会有所帮助。

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

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

在您从队列中提取消息之前,是否可以检查C2是否忙?我们可以这样做,但实际上我们不能无限期地等待发送消息。在socket繁忙之前,我们希望为所有空闲的其他客户端处理其他消息您的系统中是否存在内存限制,或者您是否可以奢侈地使用内存?哪个对你更重要?时间还是空间?我想说时间对我们来说更为有限。在您从队列中提取消息之前,是否可以检查C2是否忙?我们可以这样做,但实际上我们不能无限期地等待发送消息。在socket繁忙之前,我们希望为所有空闲的其他客户端处理其他消息您的系统中是否存在内存限制,或者您是否可以奢侈地使用内存?哪个对你更重要?时间还是空间?我想说时间对我们来说更为有限。实际上我们需要DS,因为当服务器接收到消息时,它将首先存储到DS中。然后,它将处理DS以将消息发送到指定的客户端。假设它无法在限定的时间内发送消息,它会将消息推回到DS,以便它可以处理DS中的其他消息。我不确定你在说什么。你的意思是你必须写一个DS吗?现在我们使用Deque来实现这个目的。但是我上面提到的问题是它改变了消息的顺序。因此,我想知道处理消息的正确数据结构是什么。如果不了解更多与您所做工作相关的字段,也不知道关于出列的任何信息,我将无法进一步帮助您。如果你使用C++,你可以利用一些动态的STD对象,但是如果用C写这个,管理连接数据就像一个结构数组。实际上我们需要DS,因为当服务器接收到消息时,它将首先存储到DS中。然后,它将处理DS以将消息发送到指定的客户端。假设它无法在限定的时间内发送消息,它会将消息推回到DS,以便它可以处理DS中的其他消息。我不确定你在说什么。你的意思是你必须写一个DS吗?现在我们使用Deque来实现这个目的。但是我上面提到的问题是它改变了消息的顺序。因此,我想知道在不了解wha涉及的字段的情况下,处理消息的正确数据结构是什么