有关网际互连
2007/5/10 20:44:28

Happy 的玩家应该有这个印象吧:有一段时间,敲一个 mudlist -a 命令,看
到了
好几屏的 MUD 服务器列表,大小都有,中英文也都有,真是五花八门,乱七八糟,
眼睛都看花了,:-(
我不知道这种现象能说明多少问题,我只提一点,就是 Happy 当时的名气应该是
蛮大的吧,许多未曾谋面的 MUD 自愿将 Happy 加入到自己的网际互联列表中,
使 Happy 的网上邻居异常地多起来;狮子(Lion)的 Hero 更牛,最先就是从 Hero
看到英文 MUD 互联进来的,海外关系不错嘛,hoho。当然了,网际互联的增多造
成了一些混乱现象没有得到很好的处理,是我们管理员的失职,这个以后再谈。
我想说说那一长串的网际互联 MUD 列表是怎么来的。
以往要实现两个 MUD 的互联,必须两个 MUD 都各自将对方加入自己的网际互联
配置列表中,具体是 /include/net/config.h 中定义的 LISTNODES 常量:
#define LISTNODES ([ \
    "happy":    "202.117.7.54 6670", \
    "hero":    "202.117.7.55 3378", \
])
数据是映射(mapping)类型的,"happy"、"hero" 是对方 MUD 的网上名称,
"202.117.7.54"、"202.117.7.55" 是对方 MUD 的地址,"6670"、"3378" 是对方
MUD 的 UDP 端口(UDP 是建立于无连接基础上的网络通信协议,与 TCP 协议是
相对的,TCP 是建立于连接基础上的网络通信协议),当两个 MUD 建立了网际互
联之后,双方就各自向对方的 UDP 端口发送报文,就像通过邮局寄信一样。一般
来说,XYJ 和 XKX 类 MUD 的 UDP 为游戏端口加 4 ,FY 类 MUD 的 UDP 为游戏
端口加 45 ,就像上面那两个:6666 + 4 = 6670 ,3333 + 45 = 3378
另外,"happy"、"hero" 等 MUD 的网上名称是定义在 /include/mudlib.h 中的:
#define INTERMUD_MUD_NAME  "TEST"
这个头文件中还定义了其他一些信息,如 MUD 的中文名称啦、版本啦等等,但
不是 DNS_MASTER 跑起来所必须的东西。
看看 DNS_MASTER 的运行:
DNS_MASTER 被载入内存或被 update 的时候当即就开始工作了,因此可以推断
出 DNS_MASTER 中有 create() 函数,因为 create() 函数就是在那两种情况下
被自动执行的。看看这个 create() 函数是怎么写的:
void create()
{
    mapping static_db;
    int i, j;
    string *list;
    string *strs;
    string ip, port, *listkey;
    restore_euid();
    set("channel_id", "网路精灵");
    //added by mon 10/23/97
    list = values(LISTNODES); //从 LISTNODES 中取得要互联的 MUD 的信息
    listkey = keys(LISTNODES);
    j = sizeof(list);
    muds_ip = ({});
    muds_port = ({});
    muds_name = ({});
    if( j > 0 )
        for( i = 0; i < j; i ++ ) {
            if( sscanf(list[i], "%s %s", ip, port) == 2 ) {
                muds_ip += ({ ip });
                muds_port += ({ port });
                muds_name += ({ htonn(listkey[i]) });
            } //最终所有将要互联的 MUD 的信息都存储在 muds_ip、muds_po
rt、
        }    //muds_name 这三个全局变量中(注意:是将要互联而不
是已经联上)
    // find out which port we are on 找出自己的 UDP(GamePort + 4)
    my_port = SRVC_PORT_UDP(mud_port());
    // initialise global mud info variables
    muds = allocate_mapping(MUDS_ALLOC);// muds 这个变量才是已经联上的
MUD 信息
    mud_svc = allocate_mapping(MUDS_ALLOC);
    // initialise the sequencing variables
    seq_ctr = 0;
    seq_entries = ([]);
    // set the bootserver default
    bootsrv = MUDLIST_DNS;
    bootsrv_retry = 0;
    // tell the mudlis

下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms