Archief - [C#] Telnet-client geeft commando's niet correct door

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

VenomGameworld

Legacy Member
Hallo,

Als project moet ik een Telnet-achtige client maken om gegevens uit te lezen.
Wanneer ik het test met Windows telnet-programma of Putty werkt het allemaal goed, maar het is de bedoeling dat ik een grafische front-end maak die achterliggende een telnet-sessie aanstuurt en de gegevens ophaalt.

Voor een screenshot van de sessie in Putty, klik hier.

Het is wel niet helemaal volgens de telnet-standaard, het volgende staat in de documentatie:
Omdat we gebruik maken van een TCP verbinding en alle commando’s en antwoorden in ASCII zijn, kan gebruik gemaakt worden van een Telnet(compatible) terminal programma. Het systeem herkent echter de Telnet control codes niet! Indien mogelijk moeten deze uitgeschakeld worden in het terminal programma om een goede werking te garanderen.

Ik heb op internet een Telnet-client gevonden, maar enkel het uitlezen van de prompt lukt (bovenste regel in screenshot). Wanneer ik een commando verzend, krijg ik nadien bij het uitlezen terug de prompt, maar geen foutmelding.

Weet er iemand wat ik fout doe?

Alvast bedankt!

Hieronder de code (heb wel al een stuk in commentaar gezet):
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Collections;


using System.Diagnostics;

namespace MinimalisticTelnet
{
    //enum Verbs {
    //    WILL = 251,
    //    WONT = 252,
    //    DO = 253,
    //    DONT = 254,
    //    IAC = 255
    //}

    //enum Options
    //{
    //    SGA = 3
    //}

    class TelnetConnection
    {
        TcpClient tcpSocket;

        int TimeOutMs = 1000;

        public TelnetConnection(string Hostname, int Port)
        {
            tcpSocket = new TcpClient(Hostname, Port);

        }

        public string Login(string Username,string Password,int LoginTimeOutMs)
        {
            int oldTimeOutMs = TimeOutMs;
            TimeOutMs = LoginTimeOutMs;

            string s = Read();
            Debug.WriteLine(s);

            if (!s.TrimEnd().EndsWith(")"))
               throw new Exception("Failed to connect : no login prompt");

            //WriteLine("user " + Username);
            WriteLine("ver");

            s += Read();
            Debug.WriteLine(s);
            //if (!s.TrimEnd().EndsWith(":"))
            //    throw new Exception("Failed to connect : no password prompt");
            //WriteLine(Password);

            //s += Read();
            //TimeOutMs = oldTimeOutMs;
            return s;
        }

        public void WriteLine(string cmd)
        {
            Write(cmd + "\n");
        }

        public void Write(string cmd)
        {
            if (!tcpSocket.Connected) return;
            byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF","\0xFF\0xFF"));
            //byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd);
            tcpSocket.GetStream().Write(buf, 0, buf.Length);
        }

        public string Read()
        {
            if (!tcpSocket.Connected) return null;
            StringBuilder sb=new StringBuilder();

            int input;

            do
            {
                input = tcpSocket.GetStream().ReadByte();
                System.Text.ASCIIEncoding.ASCII.GetString((byte)input);
                //ParseTelnet(sb);
                System.Threading.Thread.Sleep(TimeOutMs);
            } while (tcpSocket.Available > 0);
            return sb.ToString();
        }

        public bool IsConnected
        {
            get { return tcpSocket.Connected; }
        }

        void ParseTelnet(StringBuilder sb)
        {
            while (tcpSocket.Available > 0)
            {
                //int input = tcpSocket.GetStream().ReadByte();
                //switch (input)
                //{
                //    case -1:
                //        break;
                //    //case (int)Verbs.IAC:
                //    //    // interpret as command
                //    //    int inputverb = tcpSocket.GetStream().ReadByte();
                //    //    if (inputverb == -1) break;
                //    //    switch (inputverb)
                //    //    {
                //    //        case (int)Verbs.IAC:
                //    //            //literal IAC = 255 escaped, so append char 255 to string
                //    //            sb.Append(inputverb);
                //    //            break;
                //    //        case (int)Verbs.DO:
                //    //        case (int)Verbs.DONT:
                //    //        case (int)Verbs.WILL:
                //    //        case (int)Verbs.WONT:
                //    //            // reply to all commands with "WONT", unless it is SGA (suppres go ahead)
                //    //            int inputoption = tcpSocket.GetStream().ReadByte();
                //    //            if (inputoption == -1) break;
                //    //            tcpSocket.GetStream().WriteByte((byte)Verbs.IAC);
                //    //            if (inputoption == (int)Options.SGA)
                //    //                tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO);
                //    //            else
                //    //                tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
                //    //            tcpSocket.GetStream().WriteByte((byte)inputoption);
                //    //            break;
                //    //        default:
                //    //            break;
                //    //    }
                //    //    break;
                //    default:
                //        sb.Append((char)input);
                //        break;
                //}





            }
        }
    }
}

Hoofdprogramma:
Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace MinimalisticTelnet
{
    class Program
    {
        static void Main(string[] args)
        {
            TelnetConnection tc = new TelnetConnection("192.168.1.120", 23);

            string s = tc.Login("BMSconfigurator", "cabekitypro",1000);
            Console.Write(s);
        }
    }
}

Mee

Legacy Member
Sorry dat ik geen oplossing heb, maar ik heb wel een andere tip:
blokken code in commentaar zetten doe je met
Code:
/* 
com
men
taar 
*/
niet door voor elke lijn een // te zetten :).

Tyfius

Legacy Member
Mee zei:
Sorry dat ik geen oplossing heb, maar ik heb wel een andere tip:
blokken code in commentaar zetten doe je met
Code:
/* 
com
men
taar 
*/
niet door voor elke lijn een // te zetten :).
:offtopic:Je kan die met visual studio allemaal aanduiden en dan op de toggle comment knop duwen. Dan gaat die er overal // voor zetten.

EmP

Legacy Member
Als je een streamreader/writer gebruikt zal je code al een pak eenvoudiger zijn..
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan