在对等系统中协商共同的“网络信道”

时间:2008-11-04 16:20:39

标签: networking p2p secondlife linden-scripting-language

网络中的对等节点是否有通用或已建立的算法来决定唯一的“网络信道”(或任何其他形式的半秘密标识符)?

我工作的环境是SecondLife。我试图弄清楚如何让许多相同的对等脚本对象在“通道”号上达成一致,允许它们形成一个网络,而不会干扰同类对象的其他现有网络。

所有对象大致在同一时间实例化,并且可以访问(通用)系统时间。

我想到的方法:

  1. 基于实例化的时间。通道是从unix时间导出的(通过md5)。问题是“粗略同时”部分。它们可能会在新的第二个时刻被实例化。

  2. 随机等待。使对象等待一个随机数量,并宣布由第一个唤醒的(随机生成的)通道号。问题是,系统具有较低的时间粒度,并且在处理通告之前可以唤醒多个对象。

  3. 合并1和2.在等待随机数量后宣布高分辨率时间戳,并从最低公布时间戳中获取频道。

  4. 这必须是比我想象的更聪明的人。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

新对象如何知道要加入哪个网络(新的或现有的)?根据您的具体需求,有许多方法。

第一种方法

您可以使用比每秒更精确的计时器,例如:

integer time = llGetUnixTime();
integer channel = time - (time % 1000);

根据上面的代码,几乎同时处理的所有对象都可能具有相同的通道,尽管您可能希望确保时间%1000不接近0或1000并且可能使用时间%10000那种情况。

第二种方法

除此之外,您还可以创建某种发现协议。例如:

  1. 新的rezzed对象在硬编码控制通道上打招呼
  2. 区域中每个网络的主服务器以其网络的通道号进行响应
  3. 对象选择他想加入的网络
  4. 如果没人响应,则对象成为自己网络的服务器,通过将控制通道增加一些数字(例如+1)
  5. 如果对象想要创建自己的网络,它会将使用中的最高频道增加+1并创建自己的频道/网络
  6. 组合

    当然,你可以结合使用两种方法 - 使用llGetUnixTime()来派生频道,比如你好,如果服务器响应成为节点,否则成为服务器。此外,您可以检查适当的更高和更低的频道,以避免因为对象的rezzing时间翻滚差异而拥有两个网络。

答案 1 :(得分:0)

你的物体是否被另一个物体弄脏了?如果是这样,那么简单的解决方案是在llRezObject的整数参数中提供通道号。然后,rezzed(子)对象可以使用其on_rez事件中的param作为通道。

例如,rezzer parent将执行以下操作:

integer networkchannel = 3495293;
llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);

并且rezzed子对象将执行以下操作:

on_rez(integer networkchannel)
{
    llListen(networkchannel, "", NULL_KEY, "");
}