Telnet server

Pagina: 1
Acties:

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Ik ben een serieus bezig aan een telnet server maar ik loop tegen een aantal problemen aan:
-Die ansi codes die ik verstuur zouden niet in een dumb terminal als windows telnet moeten komen... dit doen ze wel.
-Wanneer iemand van een smartterminal iets terecht stuurt komt het als ware 2x op zijn scherm, de eerste keer als hij het typt en als hij op enter drukt. Echo staat al off, hoe zorg ik er voor dat text direct over de lijn heen gaat?

De RFC geven een goeie beschrijving van het protocol... ze vertellen dat het niet zo handig is als je alles per karakter op stuurd, maar als je dat nou wel wilt wat dan...

Steun Elkaar, Kopieer Nederlands Waar!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Als de local echo uit staat zul je bij elke toetsdruk moeten flushen, en niet pas bij een newline (wat meestal gebeurt) daarnaast schijnt er wel een manier te zijn om het type terminal over te sturen, hieraan kun je zien wat voor, en of je uberhaupt, opmaak codes mee moet sturen..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Wat ik nu doe is dus letterlijk per key inlezen (werkt perfect met windows telnet) echter in linux typ je eerst de regel wanneer je op enter drukt wordt de regel pas verstuurd, en ik weet zeker dat het anders kan... alleen ik heb daar geen source code van (de Telnet Queries dan)

Steun Elkaar, Kopieer Nederlands Waar!


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Op woensdag 27 maart 2002 19:52 schreef Skinkie het volgende:
Wat ik nu doe is dus letterlijk per key inlezen (werkt perfect met windows telnet) echter in linux typ je eerst de regel wanneer je op enter drukt wordt de regel pas verstuurd, en ik weet zeker dat het anders kan... alleen ik heb daar geen source code van (de Telnet Queries dan)
ik heb dat nog niet meegemaakt dat in Linux je eerst een enter moet geven om de keyboard te flushen.

Wat bedoel je precies met ANSi codes (ik weet wat ze zijn), maar welke ANSi standaard bedoel je en waarvoor wil je ze gebruiken?

Op welke manier initializeer jij de terminal?

Ik denk dat je SUPRESS GO-AHEAD optie eens aan moet zetten, http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc0858.html

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ff tussendoor: het zijn 2 verschillende problemen

ansi: escape codes bijvoorbeeld clear screen, go home

die flush... ik gaat het ff proberen met sga.

\033\255\253\3 Do
\033\255\254\3 Don't

werken allebei niet :'(

wat ik te zien krijg:
in linux:
code:
1
2
3
4
5
blaaat text...
    User:       blaat
blaat
    Pasword:    blaat
*****

in windows:
code:
1
2
3
4
[2J
blaaat text...
    User:       blaat
    Pasword:    *****

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Vwb die ansi codes.

Met de termtype option (24 decimaal) kan je het terminal type van de client proberen op te vragen, en dan indien nodig (en voor zover mogelijk) de ansi codes filteren.

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ja ok, dat vat ik ook nog. persoonlijk vind ik het andere probleem erger. is het misschien mogelijk dat je zegt dat je een dumb server bent ofzo?

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Vwb de line mode:

Send als server dit bij initialisatie naar de client:

WILL Suppress GA
en
DO ECHO

Dus 255 251 3
en 255 253 1

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 03-09 23:48
Je kan een kijkje nemen in de source van telnetd van linux. :)

Verwijderd

Op woensdag 27 maart 2002 21:14 schreef Skinkie het volgende:
ja ok, dat vat ik ook nog. persoonlijk vind ik het andere probleem erger. is het misschien mogelijk dat je zegt dat je een dumb server bent ofzo?
Waarom zou je dat willen? Als server ben je slechts een doorgeefluik tussen de gebruiker (client, met prompt) en de programmas die hij opstart (shell, maar ook programma's die ansi codes genereren).

Als jij als server het terminal type van de client vraagt en deze vervolgens in de omgeving plaatst van het programma wat je opstart (shell of zo) dan zullen ansi codes toch werken als de client ze aan kan?

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
\033\255\251\3\033\253\1

ookzo:
\033\255\251\3\r\n
\033\253\1\r\n

geeft nogsteeds de "fijne" dubbel op
Waarom zou je dat willen? Als server ben je slechts een doorgeefluik tussen de gebruiker (client, met prompt) en de programmas die hij opstart (shell, maar ook programma's die ansi codes genereren).

Als jij als server het terminal type van de client vraagt en deze vervolgens in de omgeving plaatst van het programma wat je opstart (shell of zo) dan zullen ansi codes toch werken als de client ze aan kan?
probleem is juist dat dit het doorgeef luik is, dit programma dus er komt geen ander programma bij.

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Je moet ook kijken naar wat de client terugstuurt. Dus als jij
WILL ECHO
stuurt, maar de client geeft geen DO ECHO terug, dan moet jij de binnenkomende karakters niet terugsturen. In dat geval heb je gewoon een akelige client.

Overigens zie ik dat ik niet compleet was, want door WILL ECHO te sturen terwijl ook de client kant nog echoot zou een loop kunnen ontstaan dus een goede client zal dat weigeren.

Volgens mij wil je dat jij als server de aan de client ingetypte tekens echoot (da's redelijk standaard), dus dan moet je proberen om:

will suppress ga
dont echo
will echo

voor elkaar te krijgen. De client zou moeten antwoorden met:

do suppress ga
wont echo
do echo

Edit:
Maar, voor de volledigheid, als de client iets antwoordt wat je liever niet hebt zul je je toch moeten schikken (volgens de RFCs). Dus, als de client de "dont echo" weigert moet je dat accepteren. En als de client je desondanks vraagt om ook te echoen dan moet dat maar.

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Op woensdag 27 maart 2002 20:56 schreef Skinkie het volgende:
ff tussendoor: het zijn 2 verschillende problemen

ansi: escape codes bijvoorbeeld clear screen, go home

die flush... ik gaat het ff proberen met sga.

\033\255\253\3 Do
\033\255\254\3 Don't

werken allebei niet :'(

wat ik te zien krijg:
in linux:
code:
1
2
3
4
5
blaaat text...
    User:       blaat
blaat
    Pasword:    blaat
*****

in windows:
code:
1
2
3
4
[2J
blaaat text...
    User:       blaat
    Pasword:    *****
Normaal gesproken moet je dmv een:

<esc>[2j een clear screen kunnen sturen in een ANSI situatie, als dat niet werkt, kijk eens welke type terminal emulatie je client denkt op dat moment te hanteren (ctrl-] oid).

dat je alles dubbel krijgt is omdat local echo aanstaat, die moet je gewoon aan zetten (dus aan de server kant een WILL ECHO zodat de client kant dat niet doet iirc).

ik zie dat je \033 stuurt waar 033 = #27 is in ASCII, waarom stuur je een Escape? Een normale ANSI interpreter zal bij het ontvangen van een Escape het volgende karakter proberen te interpreteren in jouw geval is dat een tweede escape (nl. die van de clrscr ansi code) welke dus als escape character geinterpreteerd zou worden. De #255 wordt door de terminal client geinterpreteerd.

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ik ben maar ff een groot debug progie in elkaar aan het draaien wat ik word hier een partijtje gek

write("\255\251\3\255\254\1\255\251\1");

dit zou toch moeten doen waar voor het gemaakt is?

daarvan krijg ik gewoon ascii code terug...

Steun Elkaar, Kopieer Nederlands Waar!


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
En java de debugversie:

Luisteren.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.*;
import java.net.*;

public class Luisteren implements Runnable
{
      static Socket telnet;
      DataInputStream in;

      public Luisteren(Socket telnet)
      {
            this.telnet=telnet;
            try
            {
                in=new DataInputStream(telnet.getInputStream());
            }
            catch (IOException ex)
            {
                System.err.println();
            }
      }

      public void run()
      {
            try
            {
                while (true)
                {
                      System.out.println(""+(int)in.read());
                }
            }
            catch (IOException ex)
            {
                System.err.println(ex);
            }
      }
}

Schrijven.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.*;
import java.net.*;

public class Schrijven implements Runnable
{
      static Socket telnet;
      DataOutputStream out;

      public Schrijven(Socket telnet)
      {
            this.telnet=telnet;
            try
            {
                out=new DataOutputStream(telnet.getOutputStream());
            }
            catch (IOException ex)
            {
                System.err.println();
            }
      }

      private void write(String text)
      {
            try
            {
                out.writeChars(text);
            }
            catch (IOException ex)
      {
            System.err.println();
      }
      }

      private void write(char text)
      {
      try
            {
                out.writeChar(text);
            }
      catch (IOException ex)
            {
            System.err.println();
      }
      }

      private void init()
      {
            write("\255\251\003\255\254\001\255\251\001");
      }

      public void run()
      {
            init();
      }
}

ThreadServer.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;
import java.net.*;

public class ThreadServer
{
    public static void main(String[] args)
    {
      try
      {
        ServerSocket ss=new ServerSocket(23);
            boolean ja=true;
            while (ja)
            {
                Socket sst=ss.accept();
                new Thread(new Luisteren(sst)).start();
                new Thread(new Schrijven(sst)).start();
            }
            }
      catch (IOException ex)
      {
      }
    }
}

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Oh, java.

Ik heb weinig tijd, maar opmerking 1 is dat
\255 octaal is, en dus decimaal 173. Gebruik dus \377 en niet 255, \373 en niet 251 etc.

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
kick

het probleem wat ik heb als ik het met \any stuur octaal of wat dan ook... krijg ik de char equivalenten.

Steun Elkaar, Kopieer Nederlands Waar!

Pagina: 1