※ 引述《happyhero (无用)》之铭言:
: 3.这个比较困难 不过我记得早期的Es2lib 或是国外的DSlib
: 里面都有个intermud的系统
: 同一个mudlib架设的mud之间可以互相通讯
: 使用mudlist可查询到所有mud的IP跟Port
: 可直接连线进入对方mud里
: (Tmi2里面好像也有类似的程式码 但不知如何运作)
这我不是很熟呢,不过应该核心档包括底下
/adm/daemons/channels.c
/adm/daemons/network/I3.c
/adm/daemons/network/某些被改成 .old 的档
/adm/daemons/network/I3/ (Intermud 相关目录)
/adm/etc/与上面有关的档
sanc 以前曾用同一份 driver、同一份 mudlib,架过 port 不同的
两个 mud (玩家区与巫师区),那个时候是透过像 gwiz 等指令,做
两边沟通的。
其中 /adm/daemons/network/I3.c 是最核心的东西,intermud 相
关的资料都是被 I3.c 所储存,它以 private 宣告了非常多的函数
所以也不好 call 来做一些测试。
可是我们可以修改它。
static object router_socket, oob_socket, debugger;
static mapping services;
static int debug_level;
static int bootflag; // Used to recognize the first channel list we get.
int router_password, mudlist_id, chanlist_id;
mapping mudlist, chanlist;
void create(){
if(sizeof(get_dir(I3_SAVE_FILE))) restore_object(I3_SAVE_FILE);
bootflag=1;
setup_services();
.
.
}
update I3.c 时它会呼叫上面的函数。
void setup_services(){
mixed dir;
string name;
int i;
services = ([]);
#ifdef I3_SERVICE_DETECT
dir = get_dir(I3_MODULES);
for(i=0;i<sizeof(dir);i++){
sscanf(dir[i],"%s.c", name);
if(name) services += ([ name : 1 ]);
}
#endif
services += I3_SERVICES;
return;
}
到这里大致就可猜测,services 储存的东西就类似底下
> ls
Path: [/adm/daemons/network/I3]
2 ChangeLog 7 channel.060596 1 locate.c
2 auth.c 9 channel.c* 4 tell.c*
4 channel-0505.c 2 finger.c 3 who.c*
services = (["who":1, "tell":1, "finger":1 ,.....])
我的意思就是说,你想知道一份系统档是干嘛的,就先看它的
create 做些什么,然后因为你有权限可以改系统档,自然就可
修改它,比方内建一些方便你读取资料的函数,这样自然就不
会受到 private 的限制,可自由读取其资料。
然后透过读出来的资料再去看相对映的函数内容,你就会知道
它是干嘛用的。
那因为这不是我早期想做的东西而且我也不熟,所以我会等我
有空时再研究。(总之就是现在没啥空)
> ls
Path: [/adm/etc]
2 ChangeLog 3 groups
1 DEADJOE 3 groups.bak
79 I3.o
你可以轻易发现 I3.o 档相当庞大,但是在 win 下用记事本等
相关软件很轻易可以打开它,透过撰写适当的物件,也能轻易地
加载并解析它。
应该要怀疑的是,它到底是透过人工建的,还是 tmi mud 之间
透过 I3 相互沟通后相互建立的?
Laechan