Entwickler-Ecke
Internet / Netzwerk - Indy 10 - 4Byte Längenheader (Big Endian) versenden
MR76 - Mi 30.09.09 16:46
Titel: Indy 10 - 4Byte Längenheader (Big Endian) versenden
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!!!
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;
begin OutStream:=TMemoryStream.Create;
TCPClient.Port:=StrToInT(Form2.ePort.Text); TCPClient.Host:=Form2.localhost.Text; TCPClient.Connect;
Try OutStream.LoadFromFile('Login.xml'); iSizeXML:=OutStream.Size; OutStream.Position:=0;
TCPClient.IOHandler.SendBufferSize:=iSizeXML;
TCPClient.IOHandler.Write(OutStream); OutStream.Position:=0; Finally TCPClient.Disconnect; End; OutStream.Free; end; |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Narses - Mi 30.09.09 17:06
Moin und :welcome: im Forum!
MR76 hat folgendes geschrieben : |
| 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: ;)
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
MR76 - 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:
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:
http://forum.delphi-treff.de/showthread.php?t=27131 )
Das muss doch so auch noch in Indy10 möglich sein? :?
Moderiert von
Narses: Delphi-Tags hinzugefügt
MR76 - 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 - Di 06.10.09 10:06
Moin!
MR76 hat folgendes geschrieben : |
| 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?
MR76 hat folgendes geschrieben : |
| 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!