Telnet działa tak, że każde naciśnięcie klawisza powoduje wysłanie jednego bajtu lub krótkiej sekwencji (strzałki, funkcyjne itp), natomiast serwer wysyła dowolne teksty (wyjątek stanowi bajt o kodzie 0xFF). Aby zadziałała np. komenda "ls", musisz wysłać znali "l", "s" i 0x0D, a potem przyjąć wszystko, co wysyła serwer. Potem dochodzi kwestia obsługi komend VT100/ANSI.
Jeszcze dochodzi kwestia sekwencji "negocjacyjnych", czyli kilku sekwencji startowych, zaczynających się od 0xFF. Obsługa jest o tyle ważna, bo całkowita ignorancja moze spowodować, że klient nie otrzyma nawet komunikatu do zalogowania się i dalsza praca nie będzie możliwa. Na ogół wystarczą predefiniowane odpowiedzi na komunikaty z serwera.
Jakiś czas temu ja zmierzyłem się z podobnym tematem link, tyle, że jako apka desktopowa w C#, może coś wykorzystasz. Klient telnet to jedna z kilku funkcji, ale nie jedyna. Tu są ważne następujące pliki:
Telnet - sekwencje bajtowe dla klawiszy (istnieje kilka wariantów dla strzałek, funkcyjnych, dla kompatybilności wszystkie są potrzebne), odpowiedzi na sekwencje negocjacyjne.
Telnet_Client - podłączenie do serwera sieciowego, wysyłanie i odbieranie danych, odpowiedzi na niektóre kody VT100 będące żądaniem przesłania informacji z terminala do serwera (nie jest to konieczne, ale pozwala przechodzić kilka testów w vttest
).
Core_ANSI_Parse - interpretacja tekstu wyposażonego w kody VT100/ANSI. Nie ma i nie przewiduję pełnej obsługi, obsługa jest wystarczająca do korzystania z konsoli Linuxa i do przejścia większości tekstów wizuanych z programu vttest
dostępnego dla Linux.
Readme ANSI - zawiera opis kodów VT100/ANSI zaimplementowanych w moim programie, ten zakres wystarczy w większości zastosowań.
Opis wszystkich kodów sterujących - na 99% wystarczy obsługiwać tylko te, które obsługuje VT100 plus kolory.
Jeżeli chcesz zobaczyć, jak działa telnet, to potrzebne są dwa komputery lub maszyny wirtualne, program Wireshark. Program Wireshark nie rejestruje ruchu po localhost, stąd potrzeba dwóch komputerów. Jeden z nich powinien mieć system Linux i ten będzie serwerem, do tego co najmniej program vttest
(tester terminala VT100 i pochodnych) i Midnight Commander
(sprawdzenie działania podstawowych funkcji ujawnia problemy z kompatybilnością terminala w początkowej fazie rozwoju). Najprościej testować wszystkie funkcje w vttest
, rejestrować ruch w Wireshark i sprawdzić znaczenie użytych kodów VT100.
W ten sam sposób można też zarejestrować sekwencje negocjacyjne, często klient "z własnej inicjatywy" wysyła sekwencje negocjacyjne (co też można stwierdzić bez większego problemu). W praktyce ja osobiście stwierdziłem, ze wystarczy tylko odbierać te sekwencje i na każdą odpowiednio odpowiadać. Jedynie i to też nie zawsze, z inicjatywy klienta potrzebne jest wysłanie sekwencji negocjacyjnej zawierającej informację o wielkości terminala w znakach.