Autor Beitrag
MR76
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 30.09.09 16:46 
Hallo,

ich beginne gerade mit der Delphiprogrammierung und habe folgendes Problem:
Ich soll die Kommunikation zwischen Client (Rechner) und einem Kartenterminal herstellen. (Verbindung per LAN)
Der Client soll einen 4Byte Längenangabe (xml-Frame) (Big Endian) an das Terminal. Anschließend soll das xml-frame an das Terminal gesendet werden.

Beispiel (So soll es aussehen)

00 00 01 74 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6f 64 69 6e 67......

...<?xml version="1.0" encoding="ISO-8859-1" ?>.<ServiceRequest ApplicationSender......

00 00 01 74 bedeutet also, dass der folgende XML-Frame 372 (174 Hex) Bytes lang ist.

Da der Big Endian im INet verwendet wird, wird es doch eine Funktion geben, die die Größenangabe direkt entsprechend konvertieren kann.

Ich hoffe Ihr könnt mir helfen, da ich jetzt schon eine längere Zeit an diesem Problem herumteste. Hab auch schon etwas ähnliches im Forum gefunden, doch dort scheint Indy 9 verwendet worden zu sein und in Indy 10 hab ich die entsprechenden Funktionen noch nicht gefunden.


Danke im Voraus!!!

ausblenden Delphi-Quelltext
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:
procedure TForm2.Button8Click(Sender: TObject);
var
OutStream : TMemoryStream;
iSizeXML : Integer;
//iSize : TBytes;

begin
OutStream:=TMemoryStream.Create;

//------------- Übernahme HOST und Port Daten
TCPClient.Port:=StrToInT(Form2.ePort.Text);
TCPClient.Host:=Form2.localhost.Text;
TCPClient.Connect;

Try
OutStream.LoadFromFile('Login.xml'); // Datei wird eingelesen
iSizeXML:=OutStream.Size; // Bytegröße ermittelt
//iSize:=ToBytes(iSizeXML); //
OutStream.Position:=0;

TCPClient.IOHandler.SendBufferSize:=iSizeXML;
//TCPClient.IOHandler.Write(iSizeXML);

TCPClient.IOHandler.Write(OutStream);
OutStream.Position:=0;
Finally
TCPClient.Disconnect;
End;
OutStream.Free;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 30.09.09 17:06 
Moin und :welcome: im Forum!

user profile iconMR76 hat folgendes geschrieben Zum zitierten Posting springen:
Da der Big Endian im INet verwendet wird, wird es doch eine Funktion geben, die die Größenangabe direkt entsprechend konvertieren kann.
Schau dir mal dieses Beispiel an, damit solltest du weiter kommen: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
uses
  ..., WinSock;

var
  i: Integer;
begin
  i := $12345678;
  ShowMessage(IntToHex(i,8));
  i := htonl(i);
  ShowMessage(IntToHex(i,8));
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
MR76 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 04.10.09 12:53 
Hallo,

das hört sich ja recht gut an. Werde es direkt mal testen.

Aber noch eine Frage zu Indy10. Mit welcher Funktion kann ich denn wie beschrieben die Daten (erst den Längenheader und dann den xml-Frame) senden. In Indy 9 hab ich folgende Funktion in einem Forum gefunden:
ausblenden Delphi-Quelltext
1:
IdTCPClient.WriteStream(MemoryStream, True, True);					

Diese Funktion hat Indy10 aber so leider nicht und laut folgendem Forumeintrag (selbe Thema) und auch nach langem Suchen habe ich nichts entsprechendes gefunden. Laut Forumeintrag soll die Funktion alles automatisch erledigen (Längenheader senden in Big Endian und anschließend die Daten) (Link zum Fremdbeitrag: forum.delphi-treff.d...owthread.php?t=27131 )

Das muss doch so auch noch in Indy10 möglich sein? :?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
MR76 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 06.10.09 09:33 
Hallo,

der Tipp von Narses hat mich nicht wirklich weiter gebracht. Der Längenheader wird zwar konvertiert, jedoch ist das große Problem das Senden.

Das Senden von Rechner zu Rechner funktioniert, also am Cliente / Server liegt es wohl nicht.

Und anhand des JitBit Sniffer kann ich erkennen, das auch Kontakt zum Terminal aufgenommen wird und das Terminal auch eine Antwort sendet. Jedoch scheint der Längenheader nicht korrekt am Terminal anzukommen. Wie bereits erwähnt muss erst die Längenangabe (nicht als ASCII String sondern als Byteangabe), damit das Terminal die Größe des zu erwartenden xml-frames erkennt, und dann der eigentliche xml-frame mit den Daten gesendet werden.

Weiß denn hier keiner einen Rat? :cry:
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.10.09 10:06 
Moin!

user profile iconMR76 hat folgendes geschrieben Zum zitierten Posting springen:
Der Längenheader wird zwar konvertiert, jedoch ist das große Problem das Senden.
Wenn ich mir so deine Beschreibungen ansehe, dann kann ich auch keinen Ansatzpunkt finden, hört sich alles etwas wirr an. :nixweiss: Du darfst eins nicht vergessen: wir haben die Hardware/Doku nicht vor der Nase stehen und sind komplett auf eine exakte Beschreibung deiner Tätigkeiten angewiesen. :idea:

Welche Delphi-Version benutzt du? Hast du dir mal mit Wireshark angesehen, was da über das Kabel geht? Wie sieht dein aktueller Code aus?
user profile iconMR76 hat folgendes geschrieben Zum zitierten Posting springen:
Das Senden von Rechner zu Rechner funktioniert, also am Cliente / Server liegt es wohl nicht.
Soll heißen, du hast eine Testanwendung geschrieben, die ein Terminal simuliert und da klappt der Datentransfer?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.