kostenloser Webspace werbefrei: lima-city


TCP Server, unbekannte Stringlänge

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi

    Leider gibt es hier nicht sooo viele Delphi programmierer (nicht viele, daf?r sind zu 95% Top Leute dabei :) ), aber dieses Problem k?nnte auch von C++ Programmierern gel?st werden! Die verwendeten Komponenten sind glaube ich Indy9.

    Ich schreibe gerade eine kleine TCP Anwendung welche ?ber TCP mit einem PHP Script kommuniziert.

    Das Script sendet folgende Daten (als String) an meinen Server:

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy--------------------...

    Die x-en und y-e stellen jeweils einen 32 Byte Block dar (darin wird ein md5 hash ?bergeben). Das Problem sind die ---. Diese k?nnen je nach Eingabe des Users unterschiedlich lang sein.

    Die ersten 32 byte Bl?cke les ich so aus:

    Delphi-Quellcode:
    BlockX:= AThread.Connection.ReadString(32);
    BlockY:= AThread.Connection.ReadString(32);


    Doch wie les ich nun den letzten unbestimmten Teil am elegantesten aus.

    Die erste Variante war das das PHP Script den String ausf?llt (zum Beispiel mit leerzeichen) bis er eine vorher bestimmte Bytezahl erlangt. Dies ist jedoch sehr unflexibel.

    Die zweite Variante war:

    Delphi-Quellcode:
    repeat
    TempChar:= AThread.Connection.ReadChar;
    KomplettString:= komplettString + TempChar;
    until TempChar = '';


    diese Variante schl?gt leider auch fehl (ReadChar liefert manchmal auch '' (leeren String) zur?ck, somit bricht die Schleife zu fr?h ab).

    Die 3te Variante war das ich folgende Daten sende:

    xxxxx...yyyyy...ZZZ--------------------------

    wieder 2x 32Byte an Daten, danach 3Bytes Zahlen in einem String, darin steht dann die l?nge der unbetsimmten Daten (durhc den - gekennzeichnet), welche ich dann auslesen kann. Das w?re im Prinzip her ganz easy, weil ichs total leicht auslesen k?nnte:

    Delphi-Quellcode:
    BlockX:= AThread.Connection.ReadString(32);
    BlockY:= AThread.Connection.ReadString(32);
    ZZZInteger:= StrToInt(AThread.Connection.ReadString(3));
    UserMessage:= AThread.Connection.ReadString(ZZZInteger);

    (darauf bitte keine einw?nde, nat?rlich kann ich die Zahlen als Integer speichern, wof?r ich bei 255 Zeichen nur ein Byte br?uchte, das ?ndert aber nichts an meinem Beispiel)

    Doch da gibt es das Problem das man ohne Probleme die Daten patchen kann und somit den Server aufh?ngen kann. Ein User k?nnte zum Beispiel im Z Block schreiben: 100, dann allerdings eine Nachricht hinterlassen "HAllo".

    Die Indy Funktion bleibt allerdings so lange in ihrer Routine drin, bis sie die 100 Zeichen erhalten hat, was sie allerdings nie haben wird.

    Gibt es daher eine andere Methode mein Problem zu l?sen?

    Also an alle Delphi/C++ Programmierer mit Indy Erfahrung. Immer her mit euren Vorschl?gen :)

    Gru? Tobi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. also ich hab im moment keinen delphi compiler da, aber in PASCAL(is ja bekanntlich mit Delphi verwand), klappt das ganz gut


    program strng;

    var s:string;
    var x:integer;

    begin
    s:='12345678901234567890123456789012abcdefghijabcdefghijabcdefghijabHallo, test';
    x:= 65 ;
    repeat
    write( s[x] );
    x:=x+1
    until(x > Length(s));

    readln;
    end.




    zur Erl?uterung: s ist der empfangene String. 1234.... bzw, abcd..., sind die 32 byte hashes und hallo, test ist der string, den der user oder was auch immer gesendet hat. Klappt allesdings nur, wenn danach nixhts mehr kommt
    alternativ k?nnte man nach guter alter c tradition den string mit nem nul byte abschlie?en(/NUL) 0x0 glaub ich. ob das das tcp/ip transportiert, und ob der delphi kompiler das richtig erkennt ist ne andere frage


    EDIT:

    kleiner nachtrag: nat?rlich nicht mit write ausgeben, sondern an nen anderen string dranh?ngen, und diesen dann auswerten

    Beitrag ge?ndert am 26.08.2005 14:00 von disod
  4. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi

    Ich antworte hier auf deine PN ;)

    Diese L?sung klappt deshalb nicht weil ich keine String im Arbeitsspeicher habe, von dem ich die L?nge auslesen kann. Deine Methode w?rd ich eh mit der kleinen Funktion:

    MyInteger:= length(MyString);

    l?sen.

    Gru? Tobi
  5. dann t?t ich mich mal daran machen, den TCP header auszulesen, da m?sste die l?nge drinstehen. Soweit ich wei?, gibst zumindest bei VB ne funktion im winsock die l?nge auszulesen, bei delfi m?sstes ?ber die api gehen.

    L?sung2:

    du definierst ne endzeichen/String. denn ?bertr?gste den kram base64codiert und fertisch
  6. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi

    Unabh?ngig von deinem Posting bin ich auch auf L?sung 2 gekommen, weil es schon daf?r ne fertige Funktion gab.

    Zu deinem ersteren:

    Kennst du dich gut mit dem TCP/IP Protokoll aus? Weil n?mlich im TCP Paket keine Datengr??e mit angegeben wird (die wird mittels des Data Offsets berehcnet, kein Plan wie genau das ausschaut und wie ich diesen Auslesen kann mit den Indy Komponenten).

    Ich habe auch mal gelesen das TCP Pakete immer gleich gro? sind (ich glaub 512 bytes) und ?berfl?ssige Bytes einfach mit NULL-en aufgef?llt werden.

    Daher such ich auch in nemm anderen Thread:

    http://www.lima-city.de/boards.php?m=thread&id=34674

    Nach den RFC f?rs TCP Protokoll (RFC 793).

    Wenn es nun noch ne Spur eleganter gehen w?rde w?re halt toll, aber so wie es jetzt ist reicht mir mal die L?sung (ausser es treten Sicherheitsl?cher auf, dann mu? ich mir was neues einfallen lassen).

    Gru? Tobi
  7. also mit VB und dem Winsock steuerelement ist das kein problem, da schaut das ganze so aus:

    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

    End Sub

    da kann man dann mit bytestotal die l?nge auslesen
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!