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):
Hoofdprogramma:
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);
}
}
}
.
Je kan die met visual studio allemaal aanduiden en dan op de toggle comment knop duwen. Dan gaat die er overal // voor zetten.