Dosbox-staging: Telnet支持“ softmodem”串行端口

创建于 2020-08-28  ·  9评论  ·  资料来源: dosbox-staging/dosbox-staging

经常有人问我为什么DOS终端程序在使用DOSBox时(例如,使用传统的串行/调制解调器传输协议,如XMODEM,YMODEM,ZMODEM)无法从BBS下载文件。 我看到它报告并确认,当在DOSBox .conf中将“ serialX”端口配置为“调制解调器”类型的设备时,默认情况下确实确实不支持Telnet。 它似乎将支持Telnet,因为它将连接到Telnet服务器,但实际上并不会转义已发送的IAC字符,未转义的已接收的IAC字符或识别或响应Telnet命令。 “ nullmodem”设备类型确实支持“ telnet:1 ”参数以启用Telnet支持,但是对于那些尝试使用DOS终端连接到Internet上的Telnet BBS的用户而言,这并没有真正的帮助。

我浏览了DOSBox Wiki和Manual,确实发现没有为“调制解调器”(软调制解调器)串行设备启用Telnet支持。 因此,我查看了DOSBox源代码,并在softmodem.cpp中找到了以下代码:

else if (strstr(cmdbuf,"NET1")) {
                telnetmode = true;
                SendRes(ResOK);
                return;
        }

那是一些有趣的代码。 因此,如果此软调制解调器在_any_ AT命令中出现

所以...

  1. 请记录此ATNET0 / 1命令(将1的Telnet支持设置为0,将其关闭的则设置为1)。
  2. 请修复AT命令解析器: strstr()几乎永远不会是您真正想要使用的。
  3. 请支持.conf文件中的“ telnet:1 ”选项,以默认情况下为“调制解调器”设备启用telnet支持。

很高兴进一步讨论,

谢谢,BBS用户和sysops谢谢。

所有9条评论

感谢您在软件调制解调器代码@rswindell中遇到的问题。

请记录此ATNET0 / 1命令

我们确实在README提到了NET1命令(见下文),但是也许可以改进它。

在github中,您可以“分叉此项目”,直接在fork中编辑README (使用Github的网络编辑器),然后将所做的更改推回给我们。 您的帮助在详细记录此方面将不胜感激!

BBS Gaming
----------
DOSBox's serial interface can emulate a telephone modem, which allows original
DOS terminal applications to either dial or host a BBS on the Internet 
via the Telnet protocol.

First, configure DOSBox with a serial port emulating a modem:

   [serial]
   serial1 = modem listenport:2323

Next, launch your favorite DOS terminal or BBS hosting software and configure
its corresponding serial port with default settings, as follows:

  COM1:
    - COM port 1
    - 8N1 data-bits, stop-bits, and parity
    - 57600 baud
    - 03F8 address
    - IRQ4 interrupt
    - 16550 fifo enabled
    - Software flow control (Xon/Xoff) enabled
    - Hardware flow control (CTS/RTS) enabled
    - Hardware flow control (DSR/DTR) disabled

To dial BBSes on the Internet:

  1) Set your dialing prefix to: ATNET1^MATDT to ensure file-transfers
     and command mode transitions and handled properly.

  2) Set the phone number of the BBS to its hostname or IP, optionally
     followed by the Telnet port number, for example:

      - Phone number on non-standard port: remote.bbs.com:2323
      - Phone number on standard port 23: remote.bbs.com

To host a DOS-based BBS:

 1) Configure your DOSBox serial port to listen on a Telnet port greater
    than 1024. This allows you to run DOSbox with normal user privileges
    as opposed to granting it root or administrator privileges, for example:

    [serial]
    serial1 = modem listenport:2323

 2) Configure your DOSBox machine to use a static IP address or be assigned
    a static IP via DHCP, which can typically be configured in your router.

 3) If your DOSBox machine is behind a router/firewall, add a port-
    fowarding entry to listen on TCP port 23 and pass it through to
    port 2323 to your DOSBox machine's IP address.  This allows Internet
    users to "dial" your BBS using the default Telnet port.

请修复AT命令解析器:strstr()几乎永远不会是您真正想要使用的。

您如何建议我们将strstr()替换(char*)流中的此子字符串?

请支持.conf文件中的“ telnet:1 ”选项,以默认情况下为“调制解调器”设备启用telnet支持。

听起来是个不错的建议。 因此,这将“默认”设备,就像从一开始就设置了NET1吗?

您建议我们用什么替换strstr()以类似地检测(char *)流中的此子字符串?

AT命令解析应该从左到右,在相同的字符串支持多个命令(multple命令可以在“AT”和“\ R”之间存在)。 今天在DOSbox中编写AT命令解析器的方式,您无法在其中的任何位置使用“ net0”或“ net1”连接任何主机名。 例如,将“ ATD net1.vert.synchro.net”视为只是“ ATNET1”,这显然是错误的(未尝试拨号/连接)。 一个修补程序不仅仅包括用其他函数调用替换strstr()。

听起来是个不错的建议。 因此,这将“默认”设备,就像从一开始就设置了NET1一样吗?

这里的问题是:如果.conf文件中存在“ telnet:1 ”选项,则DOSbox softmodem的行为将与从一开始就设置“ NET1” AT命令的行为相同。

当前,仅“ nullmodem”设备类型支持“ telnet:1 ”选项。

当与Hayes兼容的调制解调器接收到“ D”命令时,“ \ r”之后(和之前)的所有内容都被视为拨号模式(例如,电话号码,IP地址,主机名)。 在这种情况下使用strstr()的问题在于,它会跳过(忽略)要搜索的模式之前的所有内容,因此您不知道模式是命令的参数还是命令本身。 命令解析器需要按顺序(从左到右)处理“ AT”之后的所有命令,对于将要终止解析的任何命令(例如“ D”命令),一旦命令被处理,即会终止。

在DOSbox中实现“ NET0”或“ NET1”命令解析的方式的问题并非“ D”命令独有,我只是以它为例。 命令字符串中“ NET0”或“ NET1”之前或之后的所有AT命令也将被忽略。

与Hayes兼容的调制解调器可以处理“ AT&F&C1&D2S95 = 3Dyial-pattern \ r”之类的命令。 DOSbox softmodem AT命令处理器不支持与“ NET0”或“ NET1”相同的命令字符串中包含的任何其他命令,甚至更糟的是,如果这些字符串恰巧出现在命令参数中(例如,拨号) -D(“ D”命令的样式),解析器将字符串视为命令。 例如,“ AT Dnet1.vert.synchro.net”无法正常工作。

感谢您对@rswindell的详尽解释!

@rswindell

建议的修复程序位于PR https://github.com/dosbox-staging/dosbox-staging/pull/582

GitHub的CI在这里生成二进制文件(如果您不能从源代码构建):

@rswindell ,如果有机会,请编译并测试kc/modem-toggles-1分支或测试上面的二进制文件,然后让我们知道您的想法。

您应该能够使用建议的telnet:1标志为配置文件中的给定串行软调制解调器启用telnet模式。

现在可以通过AT命令切换Telnet模式: +NET1+NET0

Telnet模式模式在重置(ATZ)期间保持不变,并将保持在您设置为的模式下。 当telnet模式更改时,Dosbox的控制台输出将报告。

使用+NET1 (或0)进行telnet模式的运行时切换现在可以成为多AT命令集的一部分,并且不会影响拨号字符串。
例如,以下应按预期工作:

ATI3+NET1Dmyhost.NET0test.org

自述文件已更新; 让我们知道它看起来是否还可以,或者应该如何更改以进一步改善说明。

好奇这是否符合您的预期!

@rswindell非常感谢您的错误报告和详细的解释:)我将#582合并到master时,问题自动关闭。

如果您有时间,请测试一下并告诉我们是否一切都正常:)如果您发现某些故障或遗漏某些东西,请在此处发表评论,然后我将重新讨论该问题(或简单地创建一个新的问题) 。

此功能将在即将发布的0.76.0版本中发布,但在此之前,可以在我们的开发版本中对其进行测试:指向最新开发版本的链接位于: https :

谢谢你们的快速而彻底的回应。

我今天测试了dosbox-staging版本v0.76.0-alpha-690-g21a5,实际上,.conf文件中的“ telnet:1 ”选项有效,AT“ + NET1”和“ + NET0”命令有效。

在那里只有一个观察,我不知道它是否真的重要,但是“ AT +”命令通常采用“ AT + [word] = [value]”的形式-为了与该语法保持一致,DOSbox telnet命令将为“ AT + NET = 0”或“ AT + NET = 1”。 但这实际上可能并不重要,但只是以为我会提到它。

伟大的家伙!

感谢您的@rswindell测试!

的确。我也曾考虑过= (请参见其他示例),但想最小化实现此操作所需的语法(和代码)更改量,以期希望上游采用它。 如果所有DOSBox都可以进行此切换,则将为用户提供一致的体验。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

tiagotarifa picture tiagotarifa  ·  5评论

dreamer picture dreamer  ·  4评论

BPaden picture BPaden  ·  6评论

bryc picture bryc  ·  5评论

kcgen picture kcgen  ·  4评论