Announcement

Collapse
No announcement yet.

ClientSocket - SendBuf() : Wie funktioniert es?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ClientSocket - SendBuf() : Wie funktioniert es?!

    Hallo Leute,
    kann mir jemand helfen?
    Ich versuche eine Struktur
    <b>
    typedef struct _RESINFO{
    AnsiString Hive;
    KEY Key;
    } RESINFO, *P_RESINFO;
    </b>
    die aus weiteren Strukturen besteht:
    <b>
    typedef struct _KEY{
    AnsiString KeyName;
    bool CheckSubkeys;
    EINTRAG Eintrag;
    } KEY, *P_KEY;

    typedef struct _EINTRAG{
    TStringList *Name;
    TStringList *Datentyp;
    } EINTRAG, *P_EINTRAG;
    </b>
    mit der Methode SendBuf() an ServerSocket zu senden.
    Quelltext sieht ungefähr so aus:
    <br><b>
    RESINFO *RInfo = new RINFO;
    RInfo->Key.Eintrag.Name = new TStringList();
    RInfo->Key.Eintrag.Datentyp = new TStringList();
    /* Initialisierung von RInfo */
    ClientSocket1->Socket->SendBuf(RInfo, sizeof(RInfo));
    <br></b>
    1. Problem: sizeof(RInfo) liefert falsche Anzahl der Bytes.
    Werden die Daten richtig gesendet?
    2. Problem: Wie kann ich die Daten im ServerSocket wieder auslesen?
    <br>
    Danke im Vorauß
    MfG, Denis

  • #2
    Hi,

    ich kann mir nicht vorstellen, dass sizeof() den falschen Wert liefert. Dir ist schon klar, dass bei dynamisch erzeugten Werten, die Größe des Zeigers zurückgegeben wird?
    Schon mal mit sizeof(*RInfo) versucht?

    Grüße Joche

    Comment


    • #3
      Hi Jochen,
      nachdem ich RInfo mit Werten fülle, beträgt die Größe etwa 200 Bytes.
      sizeof(RInfo) und sizeof(&RInfo) liefern beide 4Bytes,
      sizeof(*RInfo) liefert 20Bytes - das ist die Länge von RInfo->Hive.
      Soll ich zuerst die Länge der einzelnen Variablen aus den Strukturen ermitteln und miteinander addieren, um die Gesamtlänge zu erhalten? Geht es nicht einfacher?
      Kann ich überhuapt so eine Struktur mit SendBuf() senden?

      Grüße
      Deni

      Comment


      • #4
        Hi Denis,

        ich hab mich mit Sockets noch nicht wirklich auseinandergesetzt, deshalb kann ich Dir nicht weiter helfen. Ich vermute aber, dass Du nicht direkt das dynamisch erzeugte Objekt versenden kannst, sondern irgendwie ein Datenpaket zusammenstellen mußt, welches Du dann versendest. z.B. mit den '>>' und '<<' Operatoren.

        Grüße,

        Joche

        Comment


        • #5
          Hallo Denis,<BR>
          wenn Du eine Struktur versendest, werden nur die Daten, die direkt dazu gehören, berücksichtigt. Das sind dann eben die Pointer, und nicht das, worauf sie zeigen. Ähnlich ist das ja auch mit dem Abspeichern in eine Datei. Schreib Dir eine Methode, die alle Daten einer RSINFO Struktur in einen Speicherblock schreibt (und zwar so, dass Du die Einzelteile hinterher wieder separieren kannst) und berechne dessen Länge. Das Ergebnis kannst Du dann versenden, musst es auf der Emprängerseite eben wieder auseinanderfieseln.
          <BR>
          Gruss<BR>
          Armi

          Comment


          • #6
            Danke Leute,
            ich habe es umgeschrieben und es hat funktioniert.
            Ich sende die Daten in einem Block mit #0 ... #n Trennzeichen und an der Serverseite leite ich input in einen Stream um und dann lese ich die Blocks aus und nehme sie auseinander.
            Grüße
            Denni

            Comment


            • #7
              Hallo Dennis,

              eine kleine Anmerkung noch zu sizeof. Du hast als Parameter eine Zeigervariable benutzt. Zeiger(-variaben) sind 4 Byte groß. Verwende als Parameter für sizeof den Klassennamen bzw. Typdef wie hinter new. In deinem Fall also sizeof(RINFO). Dann erhältst du die richtige Speichergröße.

              Gruß Ral

              Comment


              • #8
                Hallo Ralf,
                danke für den Tip, ich werde es ausprobieren!
                Grüße
                Denni

                Comment

                Working...
                X