Networking 谈判一项共同的";网络频道“;在点对点系统中
网络中的对等节点是否有共同的或已建立的算法来决定唯一的“网络通道”(或任何其他形式的半机密标识符) 我工作的环境是SecondLife。我试图找出如何让许多相同的对等脚本对象在“通道”号上达成一致,从而允许它们形成网络,而不会干扰同类对象的其他现有网络 所有对象几乎在同一时间被实例化,并且可以访问(公共)系统时间 我想到的方法是:Networking 谈判一项共同的";网络频道“;在点对点系统中,networking,p2p,linden-scripting-language,Networking,P2p,Linden Scripting Language,网络中的对等节点是否有共同的或已建立的算法来决定唯一的“网络通道”(或任何其他形式的半机密标识符) 我工作的环境是SecondLife。我试图找出如何让许多相同的对等脚本对象在“通道”号上达成一致,从而允许它们形成网络,而不会干扰同类对象的其他现有网络 所有对象几乎在同一时间被实例化,并且可以访问(公共)系统时间 我想到的方法是: 基于实例的时间。通道(由md5)从unix时间派生。问题是“大致相同”部分。它们可能会在一个新的瞬间被实例化 随机等待。让对象随机等待一段时间,并宣布由第一个唤醒对象
这一定是比我想象的更聪明的人。有更好的方法吗?新对象如何知道要加入哪个网络(新的或现有的)?根据您的具体需要,有许多方法 第一种方法 您可以使用比每秒精度更低的计时器,例如:
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
第二种方法
除此之外,您还可以创建某种发现协议。例如:
当然,您可以将这两种方法结合使用—使用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, "");
}