Les clients Telnet et leur traitement de la fin de vie

C’est une question un peu compliquée, et je m’en excuse. J’ai écrit une application Linux C sockets, un framework de base pour un serveur de discussion simpliste. Le serveur fonctionne sur mon ordinateur portable. Le client est Telnet pour le moment, jusqu’à ce que je rédige une application cliente désignée (ce qui sera plus sécurisé, espérons-le). Je sais qu’il existe de meilleures applications pour l’envoi de données de réseau génériques à partir d’un client, mais je me suis demandé pourquoi une telle situation se produisait sur un client Telnet mais pas sur un autre.

Le premier test client Telnet a été effectué sur un autre ordinateur portable Linux. Cela fonctionne comme prévu. Le suivant, cependant, était une application Blackberry appelée BBSSH qui permettait les connexions Telnet et SSH. Je suis passé via l’option Telnet, et cela fonctionne aussi. Sauf que ce n’est pas exactement.

Le code de serveur effectue l’appel de read habituel pour extraire un bloc de données, qui est traité comme une chaîne, c’est-à-dire un message. L’ancien client lit jusqu’à ce que je tape sur Entrée, puis envoie une chaîne de caractères. Cependant, l’application BB envoie chaque caractère comme si j’avais appuyé sur entrée après chacun d’eux, ce que je n’ai pas fait. Évidemment, cela a quelque chose à voir avec la mise en mémoire tampon, ce que certains clients considèrent comme une EOL de la saisie de l’utilisateur, etc. Je ne peux tout simplement pas le localiser.

Pour illustrer ceci, voici le serveur qui sort les messages reçus des clients.

Tout d’abord, le message du client Linux:

 client name: this is a test 

Maintenant, pour BBSSH:

 client name: t client name: h client name: i client name: s client name: client name: i client name: s client name: client name: a client name: client name: t client name: e client name: s client name: t 

De l’aide?

    Les clients Telnet peuvent fonctionner en mode ligne ou en mode caractère. Le client BBSSH semble fonctionner en mode caractère pour une raison quelconque.

    Il est possible que votre serveur force le client à passer en mode ligne en lui envoyant une instruction lors de la négociation ayant lieu au début d’une connexion telnet.

    La séquence d’octets que votre serveur devrait envoyer au client est 0x255 0x253 0x34, ce qui se traduit par “Interpréter en tant que commande, Do, Linemode”. Si le client veut / peut fonctionner en mode ligne, il doit répondre par 0x255 0x251 0x34 (“Interpréter en tant que commande, volonté, mode de ligne”).

    Si tout cela est nouveau pour vous (c’est-à-dire que votre serveur telnet ne fait actuellement aucune négociation), recherchez des termes tels que “négociation telnet” ou consultez certains des RFCS pertinents (le RFC 854 est Telnet lui-même, le RFC 1184 couvre l’option Linemode).

    Le protocole TCP est orienté stream, il n’existe donc pas de “message”. Vous pouvez recevoir toutes les données ensemble, ou juste un fragment à la fois.

    Dans votre cas, vous voudrez peut-être mettre en tampon tout ce qui vous sera envoyé jusqu’à ce que vous atteigniez un marqueur EOL.