我写了三个不同的代码,可以在网络上的三台不同的机器上运行。
PC1上的代码1和PC2上的代码2将2个不同的数据包发送到PC3(服务器)上的代码3。 PC3(服务器)上的代码3从PC1和PC2获取这些数据包,然后对它们进行异或,然后将其多播到PC 4,5,6 ...
系统工作正常但存在问题; PC3(服务器)需要按顺序从PC1和PC2获取数据包。一台来自PC1,另一台来自PC2。来自同一源的两个后续数据包会破坏系统。如何让服务器按顺序执行这些操作?大多数数据包按顺序排列,但在几百个数据包中每跳一次或两次都会跳过转弯,系统会给出错误的结果。我正在使用gcc工作linux btw。
谢谢。
答案 0 :(得分:0)
您可能只需要一个简单的布尔标志,告诉您最后一个数据包的来源。
你用标志清除开始程序。从PC1收到数据包时,设置标志并等待下一个数据包。如果下一个数据包来自PC2并且设置了标志,那么一切都很好,你做任何你想做的事情,然后清除标志。
如果您收到来自PC1的数据包且标志不清除,则表示您有序列错误。如果您收到来自PC2的数据包且标志未设置,那么您也会出现序列错误。
如果您有两个以上的客户端,最好使用一个简单的序列号。将其初始化为零,当您从PC1接收时将其设置为1,当您从PC2接收时将其设置为2,等等。这样,很容易看到接收到的下一个数据包是否按顺序。< / p>
如果收到无序的数据包,则有一个布尔标志,表示您需要重新同步。设置此标志时,忽略所有数据包,直到从PC1收到下一个数据包,清除标志并将序列号重置为1。
答案 1 :(得分:0)
我会用数字标记每个数据包。该数字为x+N*i
,其中x
是PC的数量,例如1
PC1
,N
是PC的总数,{{1是发送它的PC上的数据包的序列号。这是一个相当简单的模数学模型。
注意:您可以从0开始对PC进行编号,并使用i
作为因子。
这样,您可以按随机顺序接受数据包,并在多路复用流中解码其正确位置。因此,您可以缓冲传入的数据,并在收到丢失的数据包时动态重建流。
在你的情况下,它可能是PC1的奇数,甚至是PC2。
答案 2 :(得分:0)
为了使其真正健壮,PC3可以从PC1和PC2请求数据包。 PC [1/2]仅在请求时发送数据包。 PC3从PC1请求数据包,等待它,然后从PC2请求数据包,等待它然后XORs等。
优点:你没有任何序列错误,一切都被控制
缺点:需要更多代码,结果有点慢
答案 3 :(得分:0)
您是否希望为每台机器处理每个数据包?如果是这样,您可能需要为每个连接设置数据包队列,然后按顺序处理队列。当您处理空队列时,您只需坐下等待下一个数据包到达.. 如果您使用序列错误解决方案(使用布尔值),两台计算机之间的较小延迟将使您处于错误状态,而查看队列将为您提供容差...您还应该为每个连接定义最大队列大小避免过多地排队......