| Autor |
Nachricht |
pascal_schmiederer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.04.2012
Beiträge: 2
|
pascal_schmiederer Mitglied
16:30:38 27.04.2012 Titel: |
Telnet Client // Probleme mit dem auslesen des Puffers |
Zitieren |
| C++/CLI: | 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | // telnet.cpp: Hauptprojektdatei.
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
//using namespace System.Linq;
using namespace System::Text;
using namespace System::Net::Sockets; // TCP-streaming
using namespace System::Threading; // the sleeping part...
int main(array<System::String ^> ^args)
{
/* ******************* Commands ************************ */
// Password
String ^password = "XXXXXXXX";
// Command
String ^User = "root"; // User
/* ******************* Server config ******************* */
// Server Port
Int32 port = 23;
// Server Hostname
TcpClient ^client = gcnew TcpClient("192.168.1.38", port);
/* ******************* Conversion ********************** */
// Convert password in ASCII and write it into a byte-array
Encoding ^enc = Encoding::ASCII;
array <Byte> ^data = enc->GetBytes(password);
// Convert command in ASCII and write it into a byte-array
array <Byte> ^data2 = enc->GetBytes(User);
/* ******************* Initialisation ****************** */
// Client-Stream
NetworkStream ^stream = client->GetStream();
/* ******************* Send commands ******************* */
// Send User
Console::WriteLine("Sende Benutzer\n");
stream->Write(data2, 0, data2->Length);
Console::WriteLine("Benutzer gesendet\n");
// Send password
Console::WriteLine("Sende Passwort\n");
stream->Write(data, 0, data->Length);
Console::WriteLine("Passwort gesendet\n");
// Just wait a sec...
Console::WriteLine("Warte 1 Sekunde\n");
Thread::Sleep(1000);
Console::WriteLine("1 Sekunde gewartet\n");
/* ******************* Recieve ************************* */
// Strings for ASCII stream
String^ responseData = String::Empty;
String^ responseData2 = String::Empty;
// Read first stream
Int32 bytes = stream->Read(data, 0, data->Length);
responseData = enc->GetString(data, 0, bytes);
// First stream output
Console::WriteLine(responseData);
// Read second steam
// Int32 bytes2 = stream->Read(data2, 0, data2->Length);
// responseData2 = enc->GetString(data2, 0, bytes);
// Second stream output
Console::WriteLine(responseData2);
/* ******************* Close **************************** */
// Close stream/TCP-client
stream->Close();
client->Close();
/* ******************* Error handling ******************** */
// Don`t close the console...
Console::WriteLine("\n Press Enter...");
Console::Read();
return 0;
} | |
Ich habe hier ein von C# in CLI konvertierten Telnet Clienten (von einem Fern Lehrer umgeschrieben aber nicht getestet und auch ein rein privates Projekt und keine Hausaufgabe ). Dieser soll in meinem Fall mit einem Linux Receiver kommunizieren.
Leider scheint allerdings der Zeichensatz nicht zu stimmen, oder es stimmt sonst etwas nicht.... Leider kann ich das Problem nicht weiter eingrenzen.
Als Ausgabe erhalte ich:
"?? ??" -->Ja der Smily ist Absicht.
http://www.abload.de/img/unbenanntbxfpp.jpg
Ich hoffe es kann mir jemand helfen.
Natürlich ist auch die Übertragung eines Commands
mit den falschen Zeichen nicht möglich.
Ich habe auch schon versucht den Encoder umzustellen, allerdings erhalte ich dann auch nur "?" oder andere Sonderzeichen in der Ausgabe.
Vielleicht kann mir ja jemand helfen..... Danke!
Pascal |
Zuletzt bearbeitet von pascal_schmiederer am 22:16:17 30.04.2012, insgesamt 2-mal bearbeitet |
|
 |
pascal_schmiederer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.04.2012
Beiträge: 2
|
pascal_schmiederer Mitglied
00:02:04 30.04.2012 Titel: |
|
Zitieren |
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!
| C++/CLI: | 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | // 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? |
Zuletzt bearbeitet von pascal_schmiederer am 00:07:07 30.04.2012, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|