Networking 谈判一项共同的";网络频道“;在点对点系统中

Networking 谈判一项共同的";网络频道“;在点对点系统中,networking,p2p,linden-scripting-language,Networking,P2p,Linden Scripting Language,网络中的对等节点是否有共同的或已建立的算法来决定唯一的“网络通道”(或任何其他形式的半机密标识符) 我工作的环境是SecondLife。我试图找出如何让许多相同的对等脚本对象在“通道”号上达成一致,从而允许它们形成网络,而不会干扰同类对象的其他现有网络 所有对象几乎在同一时间被实例化,并且可以访问(公共)系统时间 我想到的方法是: 基于实例的时间。通道(由md5)从unix时间派生。问题是“大致相同”部分。它们可能会在一个新的瞬间被实例化 随机等待。让对象随机等待一段时间,并宣布由第一个唤醒对象

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

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

所有对象几乎在同一时间被实例化,并且可以访问(公共)系统时间

我想到的方法是:

  • 基于实例的时间。通道(由md5)从unix时间派生。问题是“大致相同”部分。它们可能会在一个新的瞬间被实例化

  • 随机等待。让对象随机等待一段时间,并宣布由第一个唤醒对象决定的(随机生成的)通道号。问题是,系统的时间粒度较低,并且在处理公告之前可以唤醒多个对象

  • 合并1和2。在等待随机量后宣布高分辨率时间戳,并从最低宣布时间戳派生通道


  • 这一定是比我想象的更聪明的人。有更好的方法吗?

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

    第一种方法 您可以使用比每秒精度更低的计时器,例如:

    integer time = llGetUnixTime();
    integer channel = time - (time % 1000);
    
    integer networkchannel = 3495293;
    llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);
    
    on_rez(integer networkchannel)
    {
        llListen(networkchannel, "", NULL_KEY, "");
    }
    
    根据上面的代码,几乎同时重新zz的所有对象可能具有相同的通道,不过您可能希望确保时间%1000不接近0或1000,并且在这种情况下可能使用时间%10000

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

  • 在硬编码的控制通道上,新重新命名的对象打招呼
  • 区域中每个网络的主服务器用其网络的通道号进行响应
  • 对象选择他想要加入的网络
  • 若并没有人响应,对象将通过将控制通道增加某个数字(例如+1)成为其自身网络的服务器
  • 若对象仍要创建自己的网络,则将使用的最高通道增量为+1,并创建自己的通道/网络
  • 组合
    当然,您可以将这两种方法结合使用—使用llGetUnixTime()派生通道,打招呼,如果服务器响应变为节点,则变为服务器。此外,您可以检查适当的较高和较低通道,以避免由于对象重定位的时间滚动差异而出现两个网络。

    您的对象是否正在被另一个对象重定位?如果是这样,那么简单的解决方案是在llRezObject的整数参数中提供通道号。然后,rezzed(子)对象可以仅使用其on_rez事件中的参数作为通道

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

    integer time = llGetUnixTime();
    integer channel = time - (time % 1000);
    
    integer networkchannel = 3495293;
    llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);
    
    on_rez(integer networkchannel)
    {
        llListen(networkchannel, "", NULL_KEY, "");
    }
    
    被重调的子对象将执行如下操作:

    integer time = llGetUnixTime();
    integer channel = time - (time % 1000);
    
    integer networkchannel = 3495293;
    llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);
    
    on_rez(integer networkchannel)
    {
        llListen(networkchannel, "", NULL_KEY, "");
    }