P
So, für alle die auch mal das Problem haben:
Telnet sendet erstamal Commandos und wenn ich die in ASCII wandle kommen eben die "?????" dabei raus.
Liest man den Puffer nochmal aus bekommt man die Daten!
// Telnet_Bytes.cpp: Hauptprojektdatei.
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
using namespace System::Net::Sockets; // TCP-streaming
using namespace System::Threading; // the sleeping part...
ref class cClient{
private:
//Festlegen der Commandos
const static Byte WILL = 251;
const static Byte WONT = 252;
const static Byte DO = 253;
const static Byte DONT = 254;
const static Byte IAC = 255;
const static Byte SGA = 3;
const static Byte TimeOut = 100;
public:
NetworkStream^ ClientStream;
TcpClient ^Client;
TcpClient ^cClient::Init(String^ server, Int32 Port){
TcpClient ^Client = gcnew TcpClient(server, Port);
return Client;
}
String ^cClient::Lesen (TcpClient ^Client, NetworkStream ^stream){
Encoding^ ascii = Encoding::ASCII;
array <Byte> ^arrInput = gcnew array <Byte> (256);
Int32 inputverb, inputoption, input, Durchlaeufe = 0;
StringBuilder ^sb = gcnew StringBuilder;
String ^responseData;
Thread::Sleep(TimeOut);
while(Client->Available > 0 || Durchlaeufe < 5){ //Durchläufe damit alles aus dem Cache gelesen wird
input = stream->ReadByte();
switch (input)
{
case IAC:
Thread::Sleep(TimeOut);
inputverb = stream->ReadByte();
switch (inputverb)
{
case IAC:
break;
case DO:
case DONT:
case WILL:
case WONT:
//Thread::Sleep(TimeOut);
inputoption = stream->ReadByte();
// stream->WriteByte(IAC);
// stream->WriteByte(inputverb == (DO ? WONT : DONT));
// stream->WriteByte(inputoption);
break;
default:
break;
}
break;
default:
arrInput[0] = 0;
arrInput[0] = input;
responseData = ascii->GetString(arrInput,0,1);
sb->Append( responseData );
break;
}
Durchlaeufe++;
}
Durchlaeufe = 0;
return sb->ToString();
}
Void cClient::Schreiben (TcpClient ^Client, NetworkStream ^stream, String ^msg){
msg = msg + "\r"; //\n für "Enter" übergabe
Encoding^ ascii = Encoding::ASCII;
array<Byte>^data =ascii->GetBytes( msg->Replace("\0xFF","\0xFF\0xFF") );
for(Int32 i = 0; i<data->Length;i++)
stream->WriteByte(data[i]);
}
Void cClient::CloseClient (TcpClient ^Client){
Client->Close();
}
};
int main(array<System::String ^> ^args)
{
//Neue Telnet Client Klasse
cClient ^NewClient = gcnew cClient;
//Neue TCPClient Verbindung
TcpClient ^HauptClient = NewClient->Init("vuuno", 23);
//Neuer Netzwerkstream
NetworkStream^ ClientStream = HauptClient->GetStream();
String ^MessageRecived, ^eingabe =" ";
Boolean open = true;
while (open)
{
MessageRecived = NewClient->Lesen(HauptClient, ClientStream);
MessageRecived = MessageRecived->TrimStart(eingabe->ToCharArray());
Console::Write(MessageRecived);
eingabe = Console::ReadLine();
if (eingabe == "exit"){
open = false;
NewClient->CloseClient(HauptClient);
}else
NewClient->Schreiben(HauptClient, ClientStream, eingabe);
}
}
Vielleicht kann ja mal jemand von den Erfahrenen drüber schauen und
mir vielleicht sagen wo das Problem mit den Commando Antworten herkommt
und warum es mit der Aktualisierung der Anzeige manchmal hapert?