Dosbox-staging: Ativação de suporte Telnet para portas seriais de "softmodem"

Criado em 28 ago. 2020  ·  9Comentários  ·  Fonte: dosbox-staging/dosbox-staging

Muitas vezes me perguntaram por que os programas de terminal DOS não conseguiam baixar arquivos de BBSes ao usar o DOSBox (por exemplo, usando protocolos de transferência serial / modem tradicionais como XMODEM, YMODEM, ZMODEM). Eu já tinha visto isso relatado e confirmado que quando uma porta "serialX" é configurada em um DOSBox .conf como dispositivo do tipo "modem", ela de fato, por padrão, não suporta Telnet. Pode parecer que ele suporta Telnet, uma vez que se conecta a servidores Telnet, mas não escapará de caracteres IAC enviados, não escapará de caracteres IAC recebidos ou reconhecerá ou responderá a comandos Telnet. O dispositivo "nullmodem" suporta um parâmetro " telnet: 1 " para habilitar o suporte Telnet, mas isso não é realmente útil para aqueles que tentam usar terminais DOS para se conectar a BBSes Telnet na Internet.

Eu olhei no Wiki e no Manual do DOSBox e realmente não consegui encontrar nada sobre como ativar o suporte Telnet para dispositivos seriais de "modem" (softmodem). Então eu olhei o código-fonte do DOSBox e encontrei este pequeno código em softmodem.cpp:

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

Esse é um código interessante aqui. Portanto, se os 4 caracteres "NET1" aparecerem _qualquer lugar_ em _qualquer_ comando AT recebido por este softmodem, ele habilitará o suporte Telnet e, em seguida, parará imediatamente de analisar o comando e retornará "OK". Isso é terrível analisando o comando AT aqui (e se "NET1" estiver no nome do host ao qual você está tentando se conectar?), Mas tanto faz. Tentei digitar "ATNET1" e realmente funciona: a próxima conexão usando "ATD ..." realmente suportava Telnet.

Então...

  1. Documente este comando ATNET0 / 1 (1 para ativar o suporte Telnet 0, para desativá-lo).
  2. Corrija o analisador de comandos AT: strstr() quase nunca é o que você realmente deseja usar.
  3. Por favor, suporte a opção " telnet: 1 " no arquivo .conf para habilitar o suporte telnet para dispositivos "modem" por padrão.

Fico feliz em discutir mais,

Obrigado, usuários e sysops do BBS, obrigado.

bug

Todos 9 comentários

Obrigado por problemas no código do softmodem @rswindell.

Documente este comando ATNET0 / 1

Mencionamos o comando NET1 em README (veja abaixo), entretanto, talvez ele possa ser melhorado.

No github, você pode 'fazer um fork deste projeto', editar README diretamente no seu fork (usando o editor da web do Github) e, em seguida, enviar sua alteração de volta para nós. Agradecemos sua ajuda em documentar isso completamente!

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.

Por favor, corrija o analisador de comandos AT: strstr () quase nunca é o que você realmente deseja usar.

O que você sugere que substituamos strstr() para detectar essa substring dentro de um fluxo de (char*) ?

Por favor, suporte a opção " telnet: 1 " no arquivo .conf para habilitar o suporte telnet para dispositivos "modem" por padrão.

Parece uma boa sugestão. Portanto, isso "padronizaria" o dispositivo como se NET1 tivesse sido definido desde o início?

O que você sugere que substituamos strstr () para detectar de forma semelhante essa substring dentro de um fluxo (char *)?

A análise do comando AT deve ser da esquerda para a direita, suportando vários comandos na mesma string (comandos múltiplos podem existir entre o "AT" e o '\ r'). Da forma como o analisador de comandos AT no DOSbox é escrito hoje, você não pode se conectar a nenhum nome de host com "net0" ou "net1" em qualquer lugar dentro dele. por exemplo, "ATD net1.vert.synchro.net" é tratado como se fosse apenas "ATNET1", o que está claramente errado (nenhuma tentativa de discagem / conexão). Uma correção consistiria em mais do que simplesmente substituir strstr () por alguma outra chamada de função.

Parece uma boa sugestão. Portanto, isso "padronizaria" o dispositivo como se NET1 tivesse sido configurado desde o início?

A pergunta aqui é: se a opção " telnet: 1 " estiver presente no arquivo .conf, o softmodem DOSbox se comportará da mesma forma como se o comando AT "NET1" tivesse sido definido desde o início.

Atualmente, a opção " telnet: 1 " é compatível apenas com o tipo de dispositivo "nullmodem".

Quando o comando 'D' é recebido por um modem compatível com Hayes, tudo após (e antes de '\ r') é tratado como o padrão de discagem (por exemplo, número de telefone, endereço IP, nome do host). O problema de usar strstr () neste caso é que ele pula (ignora) tudo antes do padrão que você está procurando, então você não sabe se o padrão era o argumento de um comando ou o próprio comando. O analisador de comandos precisa processar todos os comandos seguindo o "AT", em ordem (da esquerda para a direita), e para quaisquer comandos que irão encerrar a análise (por exemplo, o comando 'D'), termine assim que o comando for processado.

O problema com a maneira como a análise do comando "NET0" ou "NET1" é implementada no DOSbox não é exclusivo do comando "D", eu estava usando isso apenas como um exemplo. Quaisquer comandos AT que venham antes ou depois de "NET0" ou "NET1" na string de comando também são ignorados.

Um modem compatível com Hayes pode processar comandos como "AT & F & C1 & D2S95 = 3Ddial-pattern \ r". O processador de comandos AT do softmodem DOSbox não oferece suporte a nenhum outro comando incluído na mesma sequência de comando do "NET0" ou "NET1" e, pior ainda, se essas sequências aparecerem em um argumento de comando (por exemplo, um dial -padrão para o comando 'D'), o analisador trata a string como um comando. por exemplo, "AT Dnet1.vert.synchro.net" não funciona como deveria.

Obrigado pela explicação completa @rswindell!

@rswindell , quando você tiver uma chance, compile e teste o branch kc/modem-toggles-1 ou teste os binários acima e nos diga o que você achou.

Você deve ser capaz de habilitar o modo telnet para um determinado softmodem serial no arquivo de configuração usando o sinalizador telnet:1 proposto.

O modo Telnet agora pode ser alternado por meio dos comandos AT: +NET1 e +NET0 .

O modo do modo Telnet persiste nas reinicializações (ATZ) e permanecerá no modo que você configurou. A saída do console do Dosbox reportará quando o modo telnet mudar.

A comutação em tempo de execução do modo telnet usando +NET1 (ou 0) agora pode fazer parte de um conjunto de comandos multi-AT e não influenciará a string de discagem.
Por exemplo, o seguinte deve funcionar conforme o esperado:

ATI3+NET1Dmyhost.NET0test.org

O arquivo README foi atualizado; deixe-nos saber se parece OK ou como deve ser alterado para melhorar ainda mais a descrição.

Curioso para saber se isso funciona conforme o esperado para você!

@rswindell Muito obrigado pelo relatório do bug e pelas explicações detalhadas :) O problema foi encerrado automaticamente no momento em que fundi # 582 com o master.

Quando você tiver um momento, por favor, teste e diga-nos se tudo está em ordem :) Se você encontrar alguma falha ou algo faltando - simplesmente comente aqui e eu reabrirei o problema (ou simplesmente crie um novo) .

Este recurso será lançado na próxima versão 0.76.0, mas até então ele pode ser testado em nossos builds de desenvolvimento: o link para os mais novos em desenvolvimento está aqui: https://dosbox-staging.github.io/downloads/devel/

Obrigado pessoal pela resposta rápida e completa.

Eu testei a versão v0.76.0-alpha-690-g21a5 dosbox-staging hoje e, de fato, a opção " telnet: 1 " no arquivo .conf funciona e os comandos AT "+ NET1" e "+ NET0" funcionam.

Apenas uma observação ali, e não sei se realmente importa, mas os comandos "AT +" geralmente têm a forma "AT + [palavra] = [valor]" - portanto, para ser consistente com essa sintaxe, os comandos telnet do DOSbox seriam ser "AT + NET = 0" ou "AT + NET = 1". Provavelmente não importa, mas apenas pensei em mencioná-lo.

Ótimo trabalho, pessoal!

Obrigado pelos testes @rswindell!

De fato .. Eu também pensei sobre = (vendo outros exemplos), mas queria minimizar a quantidade de alterações de sintaxe (e código) necessárias para implementar isso na esperança de que o upstream o adote. Se todos os DOSBox's por aí puderem fazer essa troca, isso proporcionará uma experiência consistente para os usuários.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

BPaden picture BPaden  ·  4Comentários

dreamer picture dreamer  ·  4Comentários

tiagotarifa picture tiagotarifa  ·  5Comentários

dreamer picture dreamer  ·  5Comentários

kcgen picture kcgen  ·  6Comentários