OVH Cloud OVH Cloud

Telnet, Emacs et controle de flot

6 réponses
Avatar
Georges Ko
Bonjour,

J'ai un client telnet qui, une fois connecté, lance un programme
Java et attend des commandes de mon client dans un certain format,
mais j'ai un problème lorsque celui-ci envoie des commandes de plus de
512 octets : le serveur ne les « reçoit » pas...

En simulant à la main, je constate qu'après le 512ème caractère,
le curseur est bloqué et je ne peux pas saisir plus (même pas Enter)
mais je peux revenir en arrière (Backspace), modifier et appuyer sur
Enter mais pas plus loin que le caractère 512...

Par contre, si j'essaye dans un shell Emacs (M-x shell), je
constate que ça marche sans problème... En regardant un peu avec le
client telnet, j'ai constaté avec « toggle options » qu'en lançant Emacs
dans telnet, le client telnet change de status en passant de :

telnet> status à telnet> status
Connected to localhost. Connected to localhost.
Operating in single character mode Operating in single character mode
Catching signals locally Catching signals locally
Remote character echo Remote character echo
Local flow control -------------> No flow control

Que dois faire mon client pour passer à un tel status ?

Les RFC 1080 et 1372 parlent de l'option TOGGLE-FLOW-CONTROL:

- lorsque mon client se connecte au serveur, ce dernier envoie IAC
DO TOGGLE-FLOW-CONTROL et mon client lui répond par IAC WONT
TOGGLE-FLOW-CONTROL puis ...
- mon client envoie un IAC DO TOGGLE-FLOW-CONTROL mais le serveur
répond par IAC WONT TOGGLE-FLOW-CONTROL ... donc je ne peux pas
envoyer d'IAC SB TOGGLE-FLOW-CONTROL OFF IAC SE...

Cela dit, je prends peut-être le problème à l'envers... Voilà le
log avec Emacs:

------------------------------------8<------------------------------------
smf1 $
telnet> status
Connected to localhost.
Operating in single character mode
Catching signals locally
Remote character echo
Local flow control
Escape character is '^]'.

smf1 $ emacs
RCVD IAC SB
Received suboption TOGGLE-FLOW-CONTROL OFF

..... Début de la session Emacs .......

telnet> status
Connected to localhost.
Operating in single character mode
Catching signals locally
Remote character echo
No flow control
Escape character is '^]'.

..... Fin de la session Emacs .......

RCVD IAC SB
Received suboption TOGGLE-FLOW-CONTROL ON

smf1 $
telnet> status
Connected to localhost.
Operating in single character mode
Catching signals locally
Remote character echo
Local flow control
Escape character is '^]'.

smf1 $
------------------------------------8<------------------------------------

Que fait Emacs pour forcer le serveur à m'envoyer cette sous-option à
OFF ?

Georges
--
Georges Ko gko@gko.net 2003-12-09
Day 2 of week 50 of 2003

6 réponses

Avatar
Jacques Caron
Salut,

On Tue, 09 Dec 2003 01:29:30 +0800, Georges Ko wrote:

J'ai un client telnet qui, une fois connecté, lance un programme
Java et attend des commandes de mon client dans un certain format,
mais j'ai un problème lorsque celui-ci envoie des commandes de plus de
512 octets : le serveur ne les « reçoit » pas...

En simulant à la main, je constate qu'après le 512ème caractère,
le curseur est bloqué et je ne peux pas saisir plus (même pas Enter)
mais je peux revenir en arrière (Backspace), modifier et appuyer sur
Enter mais pas plus loin que le caractère 512...


Je dirais que c'est le shell ou autre programme qui "attend" les commandes
qui limite à 512 caractères, et pas telnet, non?

telnet> status à telnet> status
Connected to localhost. Connected to localhost.
Operating in single character mode Operating in single character
mode
Catching signals locally Catching signals locally
Remote character echo Remote character echo
Local flow control -------------> No flow control


Tu noteras surtout le "operating in single character mode" (par opposition
à line mode) qui indique bien que ce n'est pas telnet qui bloque mais le
programme au bout.

Que dois faire mon client pour passer à un tel status ?


(escape telnet)
send wont LFLOW

Pas convaincu que ça marche, mais tu peux essayer. Mais comme dit plus
haut, je doute très fortement que ce soit ça le problème.

Quel est le programme à qui tu envoies cette ligne de commande trop
longue? Un shell? Lequel?

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
Matthieu Moy
Georges Ko writes:

Que fait Emacs pour forcer le serveur à m'envoyer cette sous-option à
OFF ?


stty ?

--
Matthieu

Avatar
gko
Jacques Caron wrote in message news:...

Je dirais que c'est le shell ou autre programme qui "attend" les
commandes qui limite à 512 caractères, et pas telnet, non?


Quand je saisis le caractère "de trop", un bip est émis. Si je tape
"stty -imaxbel" avant d'entrer dans le programme, ça bloque toujours
mais il n'y a plus de bip:

imaxbel (-imaxbel)
[Digital] Does (does not) ring bell on terminal when input
buffer is full.

Quel est le programme à qui tu envoies cette ligne de commande trop
longue? Un shell? Lequel?


Un interpréteur de commandes écrit en Java, mais le problème ne vient
pas de lui, puisqu'il se comporte correctement dans Emacs...

Avatar
gko
Matthieu Moy wrote in message news:...

Que fait Emacs pour forcer le serveur à m'envoyer cette sous-option à
OFF ?


stty ?


Ah ! Exécuter "stty raw" avant de lancer le programme
résoud mon problème...

Merci pour le tuyau !

Georges


Avatar
Jacques Caron
On 8 Dec 2003 19:49:19 -0800, Georges Ko wrote:

Jacques Caron wrote in message
news:...

Je dirais que c'est le shell ou autre programme qui "attend" les
commandes qui limite à 512 caractères, et pas telnet, non?


Quand je saisis le caractère "de trop", un bip est émis. Si je tape
"stty -imaxbel" avant d'entrer dans le programme, ça bloque toujours
mais il n'y a plus de bip:

imaxbel (-imaxbel)
[Digital] Does (does not) ring bell on terminal when input
buffer is full.


Ce qui montre bien que le problème n'est pas au niveau de telnet, mais
bien du système distant. C'est quoi comme OS?

Quel est le programme à qui tu envoies cette ligne de commande trop
longue? Un shell? Lequel?


Un interpréteur de commandes écrit en Java, mais le problème ne vient
pas de lui, puisqu'il se comporte correctement dans Emacs...


Sur FreeBSD, la définition de imaxbel est:
imaxbel (-imaxbel)
The system imposes a limit of MAX_INPUT (currently 255)
char-
acters in the input queue. If imaxbel is set and the
input
queue limit has been reached, subsequent input causes the
system to send an ASCII BEL character to the output queue
(the terminal beeps at you). Otherwise, if imaxbel is
unset
and the input queue is full, the next input character
causes
the entire input and output queues to be discarded.

Moi je dirais que l'interpréteur en question met (ou laisse) le terminal
en mode ligne, alors que emacs est en mode caractère (nécessaire pour
récupérer les séquences bizzaroïdes de emacs sans avoir à attendre un LF).
Faudrait modifier les paramètres du terminal soit avec stty soit avec les
APIs équivalentes.

On devient salement hors-charte, là, faudrait rediriger vers les groupe
approprié en fonction de l'OS.

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/


Avatar
gko
Jacques Caron wrote in message news:...

Moi je dirais que l'interpréteur en question met (ou laisse) le terminal
en mode ligne, alors que emacs est en mode caractère (nécessaire pour
récupérer les séquences bizzaroïdes de emacs sans avoir à attendre un LF).
Faudrait modifier les paramètres du terminal soit avec stty soit avec les
APIs équivalentes.

On devient salement hors-charte, là, faudrait rediriger vers les groupe
approprié en fonction de l'OS.


Vu que j'ai résolu mon problème en balançant un "stty raw", ce
fil peut se terminer... Merci encore d'avoir jeté un coup
d'oeil.

Georges