Dosbox-staging: Aktivierung der Telnet-Unterstützung für serielle "Softmodem" -Anschlüsse

Erstellt am 28. Aug. 2020  ·  9Kommentare  ·  Quelle: dosbox-staging/dosbox-staging

Ich wurde oft gefragt, warum DOS-Terminalprogramme bei Verwendung von DOSBox keine Dateien von BBS herunterladen können (z. B. mit herkömmlichen seriellen / Modem-Übertragungsprotokollen wie XMODEM, YMODEM, ZMODEM). Ich hatte gesehen, dass es gemeldet und bestätigt wurde, dass, wenn ein "serialX" -Port in einer DOSBox .conf als Gerät vom Typ "Modem" konfiguriert ist, Telnet standardmäßig nicht unterstützt wird. Es scheint Telnet zu unterstützen, da es eine Verbindung zu Telnet-Servern herstellt, aber es entgeht nicht gesendeten IAC-Zeichen, entkoppelt empfangenen IAC-Zeichen oder erkennt oder antwortet auf Telnet-Befehle. Der Gerätetyp "nullmodem" unterstützt zwar einen " telnet: 1 " -Parameter, um die Telnet-Unterstützung zu aktivieren. Dies ist jedoch für Benutzer, die versuchen, mithilfe von DOS-Terminals eine Verbindung zu Telnet-BBS im Internet herzustellen, nicht wirklich hilfreich.

Ich habe das DOSBox-Wiki und -Handbuch durchgesehen und konnte wirklich nichts darüber finden, die Telnet-Unterstützung für serielle "Modem" -Geräte (Softmodem) zu aktivieren. Also habe ich den DOSBox-Quellcode durchgesehen und dieses kleine Stück Code in softmodem.cpp gefunden:

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

Das ist ein interessanter Code. Wenn also die 4 Zeichen "NET1" _anywhere_ in _any_ AT-Befehlen erscheinen, die von diesem Softmodem empfangen werden, wird die Telnet-Unterstützung aktiviert und das Parsen des Befehls sofort beendet und "OK" zurückgegeben. Das ist eine ziemlich schreckliche Analyse von AT-Befehlen (was ist, wenn "NET1" zufällig in dem Hostnamen enthalten ist, mit dem Sie eine Verbindung herstellen möchten?), Aber was auch immer. Ich habe versucht, "ATNET1" einzugeben, und tatsächlich funktioniert es: Die nächste Verbindung mit "ATD ..." hat tatsächlich Telnet unterstützt.

So...

  1. Bitte dokumentieren Sie diesen ATNET0 / 1-Befehl (1, um die Telnet-Unterstützung auf 0 zu setzen, um sie auszuschalten, wenn sie deaktiviert ist).
  2. Bitte korrigieren Sie den AT-Befehlsparser: strstr() ist fast nie das, was Sie tatsächlich verwenden möchten.
  3. Bitte unterstützen Sie die Option " Telnet: 1 " in der .conf-Datei, um die Telnet-Unterstützung für "Modem" -Geräte standardmäßig zu aktivieren.

Gerne weiter zu diskutieren,

Danke, BBS-Benutzer und Sysops, danke.

bug

Alle 9 Kommentare

Vielen Dank für Probleme im Softmodem-Code @rswindell.

Bitte dokumentieren Sie diesen ATNET0 / 1-Befehl

Wir erwähnen den Befehl NET1 in README (siehe unten), aber vielleicht könnte er verbessert werden.

In Github können Sie dieses Projekt "abspalten", die README direkt in Ihrer Abzweigung bearbeiten (mit dem Web-Editor von Github) und dann Ihr Wechselgeld an uns zurücksenden. Ihre Hilfe bei der gründlichen Dokumentation wäre sehr dankbar!

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.

Bitte korrigieren Sie den AT-Befehlsparser: strstr () ist fast nie das, was Sie tatsächlich verwenden möchten.

Was schlagen Sie vor, um strstr() durch zu ersetzen, um diesen Teilstring in einem (char*) Stream auf ähnliche Weise zu erkennen?

Bitte unterstützen Sie die Option " Telnet: 1 " in der .conf-Datei, um die Telnet-Unterstützung für "Modem" -Geräte standardmäßig zu aktivieren.

Klingt nach einem guten Vorschlag. Dies würde das Gerät also "standardmäßig" "standardisieren", als ob NET1 von Anfang an festgelegt worden wäre?

Was schlagen Sie vor, durch das wir strstr () ersetzen, um diesen Teilstring in einem (char *) - Stream auf ähnliche Weise zu erkennen?

Das Parsen von AT-Befehlen sollte von links nach rechts erfolgen und mehrere Befehle in derselben Zeichenfolge unterstützen (zwischen "AT" und "\ r" können mehrere Befehle vorhanden sein). So wie der AT-Befehlsparser in DOSbox heute geschrieben ist, können Sie keine Verbindung zu einem Hostnamen mit "net0" oder "net1" herstellen. Beispiel: "ATD net1.vert.synchro.net" wird so behandelt, als wäre es nur "ATNET1", was eindeutig falsch ist (es wird kein Wählen / Verbinden versucht). Ein Fix würde mehr bestehen als nur strstr () durch einen anderen Funktionsaufruf zu ersetzen.

Klingt nach einem guten Vorschlag. Dies würde das Gerät also "standardmäßig" "standardisieren", als ob NET1 von Anfang an eingestellt wäre?

Die Frage hier lautet: Wenn die Option " telnet: 1 " in der .conf-Datei vorhanden ist, verhält sich das DOSbox-Softmodem genauso, als ob der AT-Befehl "NET1" von Anfang an festgelegt worden wäre.

Derzeit wird die Option " telnet: 1 " nur für den Gerätetyp "nullmodem" unterstützt.

Wenn der Befehl 'D' von einem Hayes-kompatiblen Modem empfangen wird, wird alles nach (und vor dem '\ r') als Wählmuster behandelt (z. B. Telefonnummer, IP-Adresse, Hostname). Das Problem bei der Verwendung von strstr () besteht in diesem Fall darin, dass alles vor dem gesuchten Muster übersprungen (ignoriert) wird, sodass Sie nicht wissen, ob das Muster das Argument für einen Befehl oder den Befehl selbst war. Der Befehlsparser muss alle Befehle nach "AT" in der Reihenfolge (von links nach rechts) verarbeiten und für alle Befehle, die das Parsen beenden (z. B. den Befehl 'D'), beenden, sobald der Befehl verarbeitet wurde.

Das Problem mit der Art und Weise, wie die Befehlsanalyse "NET0" oder "NET1" in DOSbox implementiert ist, betrifft nicht nur den Befehl "D". Ich habe dies nur als Beispiel verwendet. Alle AT-Befehle, die vor oder nach "NET0" oder "NET1" in der Befehlszeichenfolge stehen, werden ebenfalls ignoriert.

Ein Hayes-kompatibles Modem kann Befehle wie "AT & F & C1 & D2S95 = 3Ddial-pattern \ r" verarbeiten. Der AT-Befehlsprozessor des DOSbox-Softmodems unterstützt keine anderen Befehle, die in derselben Befehlszeichenfolge wie "NET0" oder "NET1" enthalten sind, und noch schlimmer, wenn diese Zeichenfolgen zufällig in einem Befehlsargument (z. B. einem Wählrad) erscheinen -muster nach dem Befehl 'D') behandelt der Parser die Zeichenfolge als Befehl. zB "AT Dnet1.vert.synchro.net" funktioniert nicht wie es sollte.

Vielen Dank für die ausführliche Erklärung @rswindell!

@rswindell , wenn Sie eine Chance haben, kompilieren und testen Sie bitte den Zweig kc/modem-toggles-1 oder testen Sie die obigen Binärdateien und teilen Sie uns

Sie sollten in der Lage sein, den Telnet-Modus für ein bestimmtes serielles Softmodem in der Konfigurationsdatei mit dem vorgeschlagenen Flag telnet:1 zu aktivieren.

Der Telnet-Modus kann jetzt über die AT-Befehle umgeschaltet werden: +NET1 und +NET0 .

Der Telnet-Modus bleibt auch beim Zurücksetzen (ATZ) erhalten und bleibt in dem Modus, auf den Sie ihn eingestellt haben. Die Konsolenausgabe von Dosbox meldet, wenn sich der Telnet-Modus ändert.

Die Laufzeitumschaltung des Telnet-Modus mit +NET1 (oder 0) kann jetzt Teil eines Multi-AT-Befehlssatzes sein und hat keinen Einfluss auf die Wählzeichenfolge.
Zum Beispiel sollte Folgendes wie erwartet funktionieren:

ATI3+NET1Dmyhost.NET0test.org

Die README-Datei wurde aktualisiert. Lassen Sie uns wissen, ob es in Ordnung aussieht oder wie es sich ändern sollte, um die Beschreibung weiter zu verbessern.

Neugierig, ob dies für Sie wie erwartet funktioniert!

@rswindell Vielen Dank für den Fehlerbericht und die detaillierten Erklärungen :) Das

Wenn Sie einen Moment Zeit haben, testen Sie uns bitte und sagen Sie uns, ob jetzt alles in Ordnung ist :) Wenn Sie einen Fehler finden oder etwas fehlt - kommentieren Sie einfach hier und ich werde das Problem erneut öffnen (oder einfach ein neues erstellen). .

Diese Funktion wird in der kommenden Version 0.76.0 veröffentlicht, kann aber bis dahin in unseren Entwicklungs-Builds getestet werden: Der Link zu den neuesten Entwicklungs-Builds finden Sie hier: https://dosbox-staging.github.io/downloads/devel/

Vielen Dank für die schnelle und gründliche Antwort.

Ich habe heute die Dosbox-Staging-Version v0.76.0-alpha-690-g21a5 getestet, und tatsächlich funktioniert die Option " telnet: 1 " in der .conf-Datei und die Befehle AT "+ NET1" und "+ NET0".

Nur eine Beobachtung dort, und ich weiß nicht, ob es wirklich wichtig ist, aber "AT +" - Befehle haben normalerweise die Form "AT + [Wort] = [Wert]" - um mit dieser Syntax übereinzustimmen, würden die DOSbox-Telnet-Befehle sei "AT + NET = 0" oder "AT + NET = 1". Es spielt jedoch wahrscheinlich keine Rolle, dachte aber nur, ich würde es erwähnen.

Großartige Arbeit, Leute!

Danke für die Tests @rswindell!

In der Tat .. Ich hatte auch über = nachgedacht (siehe andere Beispiele), wollte aber die Menge an Syntax- (und Code-) Änderungen minimieren, die erforderlich sind, um dies zu implementieren, in der Hoffnung, dies vorab zu übernehmen. Wenn alle DOSBoxen da draußen diesen Wechsel vornehmen können, bietet dies den Benutzern eine konsistente Erfahrung.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen