发信人: flyroc (永远的飞天大鹏), 信区: Mud_Builder
标  题: 强大的Mud互联
发信站: BBS 水木清华站 (Sun Jul 27 13:15:33 1997)

首先如果那些声名版权如何如何的人如果抄袭本文中的编程思想不经本人
同意，本人将保留追究的权利。

    本想发在清华BBS的MUD版，但清华BBS注册时间较长，于是原信先
发在了华中BBS上。不想昨天华中BBS唯护，那信被删掉于是改投到这里
，希望不会再遭厄运。希望这封信对各地的Mud巫师能有所帮助。

    据我了解现在所有大陆上运行的MUD都是清华转译台湾annihilator
的ES的衍生版，如侠客行、风云、XO等等。FTP和联网Mud功能是在台湾
ES中实现的，但由于当时大家到ES了解不够深入，这部分代码在清华ES
中没有完成移值，功能没有实现。后来的这些版本中有的嫌多而删掉了。

    我曾和USTC_MUD的一个巫师讨论过ES2，当时我们除了/adm/daemons
                                                                               
    我曾和USTC_MUD的一个巫师讨论过ES2，当时我们除了/adm/daemons
一些程序外，其它部分都已经称得上十分熟悉了。他说他曾改过/adm/daemons
下的所有程序，除/adm/daemon/network下的部分是底层用户和服务器连
接部分是最基本的已经做好不用再改，现在回想一下当时我们都嫌这段代
码太长没看以致于根本不了解它实现了什么。

    当时我的心思是做几个职业(丐帮[偷]，杀手帮[杀]，医生公会[疗]，
镖局[护]，警察[捕])，能根据不同职业定不同任务而不简单只是杀人和给
东西简单的情节。为了寻找一些函数的说明我只好求助于MudOS的说明文档，
在socket部分的惊喜地发现了Mud的网络功能，也就是说可以实现不同Mud之
间的通讯！

    以后就是从/adm/daemons/channeld.c程序入手，从网络核心程序
/adm/daemons/network/dns_master.c开始分析，在两个实验机上秘密编程
(科大除USTC_MUD外所有MUD均不合法，一经发现立即封掉IP)，断断续续用
了近一个月的时间研究代码，基本实现联网功能。

    Mud的端口号分配是这样的，除去在config.XXX中列出的游戏端口之外，
它还设置/include/net/ftpconfig.h中的FTPD_PORT(4100)为上下传文件服务
ftp端口，游戏端口+4为Mud互联端口。

    dns_master工作的原理是这样的，当一开机后，它自动地在/include
/net/config.h中给出的LISTNODES(待联Mud网络端口列表)中进行ping，如果
                                                                             
  /net/config.h中给出的LISTNODES(待联Mud网络端口列表)中进行ping，如果
成功则用send_udp向对方互联端口发送关于本地Mud的一些基本信息(如地址，
网络名称，网络端口等)，信息流格式为@@@||信息||@@@。对方在互联端口接收
后read_callback，将其加入本地的互联Mud列表，互联Mud名列表中(可以用query_muds
及query_svc获得)并回送当地已接受信息，发出方接收后同时登记该互联端口，
以后双方就可以实现即时通讯。发送方将信息打包后，用dns_master的send_udp
向所有登记的互联端口发出信息，对方通过read_callback接收成mapping类型数
据，就可以通过/adm/daemons/network/services中的各个程序的incoming_request
处理该数据消息，实现通讯。ES2中实现的频道互联(gwiz,es)可供参考。

    这种通讯只要一方把对方列入待连Mud列表就可实现，如果本机开机之时对
方的Mud尚未开放刚要等一段时间4*REFRESH_INTERVAL(5分钟)和PING_INTERVAL
(半小时)后再重新试一次。如果开放则继续上面工作。

    这种网络互联可以把多个Mud联结起来，使参与者可以成百上千，是单个
Mud远不能及。而网间交谈(gtell)，网间巫师交谈(gwiz_msg)，网间使用者
列表(gfinger)功能亦得以实现，如果要加上去巫师只需仿照CHANNEL_D进行
修改就可以。网络功能是实现Mud扩展的重要手段，是MudOS中的精华所在，
是单个Mud远不能比的。这一点值得重多巫师花大精力投入和学习。

    再远一点，实现不同Mud间的时空穿越也是完全有可能的。MudOS虽然不支
持object型的数据流，但可以在公共物件统一的前提下，用字符流传送玩家数
据及相关资料实现从一个Mud离开到另一个Mud中去，这样相当于把一个Mud地图
扩大几倍，比如从北京的Mud联到上海，则北京的这人档案就移到了上海而下图
次这人只能从上海开始登录，这是一项极有挑战性和吸引力的工作。建议大家
注意一下socket有关函数的说明文档，了解它的强大功能。上面的话不是天方
夜潭只要努力实现它是完全有可能的。
                                           
                                                                               