Telnet Output in RTF Box darstellen

21/12/2008 - 13:31 von Thomas Hübner | Report spam
Hi NG,

ich connecte über telnet Port23 auf ein Linux System und möchte die
Ausgaben mit AppendText in eine RTF Box einfügen. Vermutlich kommen aber
vom Linuxsystem Formatierungszeichen mit (Putty stellt das auch Farbig dar):

/var # ls
bin httpd
local_radio run share 

Kennt jemand eine Lösung dafür? Plan A wàre die Formatierung für die RTF
Box nutzen. Plan B wàre wenigstens den Text sauber darstellen. In Code
sieht der ganze Telnet Client recht unspektakulàr aus - im Prinzip nur
ein loopender Thread der vom Socket auf Port 23 empfàngt:

Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Text.RegularExpressions

Public Class Form1

Dim remoteIPAddress As IPAddress
Dim ep As IPEndPoint
Dim tnSocket As Socket

Private serverResponse As String
Private endReceiveThread As Boolean = False
Private receivedBytes As Integer
Private sendedBytes As Integer
Private telReceive As Threading.Thread


Private Sub cmdSend_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles cmdSend.Click
TelnetSend(TextBox1.Text)
TextBox1.Text = ""
End Sub

Private Sub init(ByVal PIPAddress As String, ByVal PPort As String)
remoteIPAddress = IPAddress.Parse(PIPAddress.Trim)
ep = New IPEndPoint(remoteIPAddress, CType(PPort.Trim, Integer))
tnSocket = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, _
ProtocolType.Tcp)
End Sub

Private Function OpenTelnetSocket() As Boolean
Try
If Not tnSocket.Connected Then tnSocket.Connect(ep)
Catch ex As SocketException
MsgBox("no connection possible")
tnSocket.Disconnect(True)
Return False
End Try

Return True
End Function

Private Sub ReceiveTelnetMessages()
Try
If Not DirectCast(tnSocket, Socket) Is Nothing Then
Dim RecvString As String = String.Empty
Dim RecvBytes(255) As [Byte]
Dim NumBytes As Integer = 0
NumBytes = tnSocket.Receive(RecvBytes, RecvBytes.Length, 0)
RecvString &= Encoding.ASCII.GetString(RecvBytes, 0,
NumBytes)
receivedBytes += NumBytes
RecvString = RecvString.Replace(vbCr, "")
RecvString = RecvString.Replace(vbLf, vbNewLine)

serverResponse = RecvString
Me.Invoke(WrapperLogRefresh)
End If
ThreadStart()
Catch e As SocketException
serverResponse = "connection error - Check Server"
End Try
End Sub

Public Sub ThreadStart()
Try
If Not endReceiveThread Then
telReceive = New Threading.Thread(AddressOf
ReceiveTelnetMessages)
telReceive.Start()
End If
Catch ex As Exception
MsgBox("ThreadStart: " & ex.Message & " - " & ex.Source)
End Try
End Sub

Private Delegate Sub _WrapperLogRefresh()
Private WrapperLogRefresh As New _WrapperLogRefresh(AddressOf
Do_LogRefresh)

Private Sub Do_LogRefresh()
txtRecv.AppendText(serverResponse)
txtRecv.ScrollToCaret()
tsl_send.Text = "sent: " & _
sendedBytes.ToString & _
" Bytes"
tsl_receive.Text = "received: " & _
receivedBytes.ToString & _
" Bytes"
End Sub

Private Sub TextBox1_KeyUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles TextBox1.KeyUp

If e.KeyCode = Keys.Return Then
TelnetSend(TextBox1.Text)
TextBox1.Text = ""
End If
End Sub

Public Sub TelnetSend(ByVal message As String)
Dim SendBytes As [Byte]() = Encoding.ASCII.GetBytes(message &
vbNewLine)
sendedBytes += SendBytes.Length
If Not tnSocket Is Nothing Then
If tnSocket.Connected Then
tnSocket.Send(SendBytes, SendBytes.Length,
SocketFlags.None)
End If
End If
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing

endReceiveThread = True
If Not telReceive Is Nothing Then
If telReceive.IsAlive Then
telReceive.Abort()
End If
End If
If Not tnSocket Is Nothing Then
If tnSocket.Connected Then
tnSocket.Disconnect(True)
End If
tnSocket.Close()
End If
End Sub
 

Lesen sie die antworten

#1 Elmar Boye
22/12/2008 - 10:04 | Warnen spam
Hallo Thomas,

Thomas Hübner schrieb:
ich connecte über telnet Port23 auf ein Linux System und möchte die
Ausgaben mit AppendText in eine RTF Box einfügen. Vermutlich kommen aber
vom Linuxsystem Formatierungszeichen mit (Putty stellt das auch Farbig
dar):

/var # ls
bin httpd local_radio
run share



Das Ganze nennt sich Terminal Emulation:
<URL:http://en.wikipedia.org/wiki/Terminal_emulator>

Ein RTF Steuerelement ist dafür nur bedingt geeignet, da
Darstellungen wie invers, blinkend uam. vorkommen, was mit
RTF schwer darstellbar ist.

Kennt jemand eine Lösung dafür? Plan A wàre die Formatierung für die RTF
Box nutzen. Plan B wàre wenigstens den Text sauber darstellen.



Wenn Du es selbst machen willst, müsst Du die Steuersequenzen
interpretieren. Und verwendest für die Darstellung besser ein
eigenes Steuerelement auf Basis eines Panels.
Wobei Du die Daten in einem eignen Puffer verwaltest - übliche
Größen sind 24/25 Zeilen a 80 oder 132 Spalten - der Zeichen
wie aktuelle Auszeichnung (Farbe, Hell, invers, blinkend usw.)

Auch ohne Auszeichnungen mußt Du zumindest die Positionssteuercodes
interpretieren, um eine verstàndliche Darstellung hinzukriegen.
Vor mehr als 15 Jahren habe ich sowas mal selbst gebaut,
das dauert erfahrungsgemàß ein, zwei Tage.

Deswegen ist es einfacher Du greift auf was fertiges zurück,
z. B. (nicht nàher angeschaut):
<URL:http://www.codeproject.com/KB/IP/te...l.aspx>
<URL:http://www.codeproject.com/KB/IP/Te...t.aspx>

Gruß Elmar

Ähnliche fragen