Hilfe mit zu schnellen Daten



  • das hatte ich verworfen, weil ich nicht weiterkam...und habe eine andere idee mit länge versucht...bekommst aber gleich deine version mit dem länge:string



  • Serverseite:
    [cpp]
    void __fastcall TForm1::ServerIPClientConnect(TObject *Sender,
    TCustomWinSocket *Socket)
    {
    zaehler++;
    for(int y=0; y<zaehler; y++)
    {
    werkzeuge = "los";
    werkzeuge = IntToStr(werkzeuge.Length()) + ":" + werkzeuge;
    ServerIP->Socket->Connections[y]->SendText(werkzeuge);
    Sleep(10);Mit sleep wollte ich die sendegeschwindigkeit senken, lommen aber wieder raus wenns klappen sollte
    for(int x=0; x<zaehler; x++)
    {
    Sleep(50);
    werkzeuge = ServerIP->Socket->Connections[x]->RemoteAddress;
    werkzeuge = IntToStr(werkzeuge.Length()) + ":" + werkzeuge;
    ServerIP->Socket->Connections[y]->SendText(werkzeuge);
    Sleep(50);
    }
    }
    }

    Clientseite:

    void __fastcall TForm1::ClientIPRead(TObject *Sender,
    TCustomWinSocket *Socket)
    {
    String s;
    s = Socket->ReceiveText();
    Und hier muss irendwas hin, was die kommenden daten puffert oder die länge wieder von dem string trennt
    if(s == "los")
    {
    ListBox1->Clear();
    ListBox1->Items->Add("Alle");
    }
    if(s == "kill")
    {
    ClientText->Socket->Disconnect(0);
    ClientIP->Socket->Disconnect(0);
    }
    if(s != "kill" && s != "los")
    {
    ListBox1->Items->Add(s);
    }
    }[/cpp]

    EDIT: Bitte Codetags verwenden: sfds



  • BITTE CODE-TAGS VERWENDEN!

    Also das Sleep würde ich jetzt schon rausnehmen, da mit Sleep dein Programm für die angegebene Zeit angehalten wird. Den String zerlegen kannst du zB mit AnsiString::Pos() und AnsiString::SubStr() oder AnsiString::IsDelimiter(). Wie man die Methoden anwendet steht in der BCB-Hilfe



  • Darkwing schrieb:

    Und hier muss irendwas hin, was die kommenden daten puffert oder die länge wieder von dem string trennt

    Genau. Und das erwarte ich jetzt eigentlich von dir, dass du das Codierst... PuppetMaster hat ja schon hinweise geliefert...

    -junix



  • bin dabei...bin dabei...



  • Schau Dir mal das Beispiel in c:\Programme\Borland\CBuilder6\Examples\FastNet\Stream\

    an.

    Mit den FastnetCompos kannst Du Streams (MemoryStream, FileStream, StringStream usw.) bequem an eine Ziel IP schicken.



  • Dafür sind die Fastnet Komponenten im handling allgemein etwas schrottiger.. (meine Meinung)..



  • und wie iss das???
    weiß nur noch nicht genau wie es zuende geht

    void __fastcall TForm1::ClientIPRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
         char *zeichen;
         char *messg;
         String s, laenge, ergebniss;
         s = Socket->ReceiveText();
    
         zeichen = strtok(s.c_str(), ":");
         AnsiString test = messg = strtok(NULL, "±");
         test = messg;
         laenge = zeichen;
         if(IsDelimiter(s.Pos(3), test, laenge.Length()) == true)
         ShowMessage(laenge);
    
         else
         ShowMessage("habs net verstanden");
    


  • Etwas umständlich oder? Wozu Strtok wenns AnsiString::Pos gibt? Probier hald den Code aus, mach nen Teststring den du durch die Funktion laufen lässt und üb ein Wenig mit dem Debugger um zu verstehen was passiert...

    -junix



  • mein prob iss das ich schon mit sttok gearbeitet habe und strin pos nicht verstanden habe



  • Darkwing schrieb:

    mein prob iss das ich schon mit sttok gearbeitet habe

    Und das hält dich davon ab was neues zu lernen?

    Darkwing schrieb:

    und strin pos nicht verstanden habe

    Wenn du nicht verstanden hast, was in den Methodenbeschrieben von AnsiString steht, dann frag hier nach. Aber sag auch WAS du nicht verstehst. Das ist recht esentiell zum helfen.



  • junix schrieb:

    Dafür sind die Fastnet Komponenten im handling allgemein etwas schrottiger.. (meine Meinung)..

    Warum, sind die Dinger instabil? Wir transferieren mit unseren Anwendungen rucki-zucki die ganzen Configdaten zu den Clients usw. Schnell noch 'nen Header vor den Stream gehagen und ab die Post (PostIt()). Einfacher gehts eigentlich nicht, wenn ich mir hier so anschaue wie sich Darkwing die Flügel, äh Finger abbricht, bloß um ein paar Strings zu übertragen ...

    Mal ein Tipp:

    1. TStringList mit den zu versendeten Parametern erzeugen
    2. StringList->Commatext in einen Stringstream
    3. Stringstream mit NMStream (Fastnet) an den Zielrechner verschicken
    4. und dann auf dem Zielrechner das ganze umgekehrt auslesen



  • wie wär es wenn du einfach nach jeden string nen endzeichen setzt.
    das denn per string zeichen abfrage ansprichst per schleife?
    so kriegst dennja string länge raus für jeden string dann einfach teilen fertig.



  • ich habe jetzt ansistring pos ausprobiert und festgestellt, das mir das ganze die position eines zu suchenden objektes zurückgibt...
    aber was fang ich dann damit an?



  • AnsiString hat ne schöne MEthode "SubString"...

    @MacFly: Womit wir wieder bei einem Protokoll wären... (der Kreis schliesst sich) (o;

    @F98 Och bitte... der bricht sich keine Flügel sondern ist dabei seine Schwingen zu stärken... Ich bin überzeugt die ERfahrung tut ihm gut...

    -junix



  • So, danke bis hierhin...werde nun erstmal nicht am pc sein können würde mich aber morgen freuen euch alle wieder zu belästigen mit meinen problemen.

    und dnake das ihr mir die lösung nicht einfach gegeben habt...



  • Ich werd gleich irre!!!
    Ich nutze substring(von wo als int, bis wo als int) und bekomme einen int wieder...WIESO!!!! Substring soll doch nen string liefern, keine zahl.
    in dem folgenden beispiel ist der string s = "3:los"

    AnsiString s, ergebniss, search, bla;
         s = Socket->ReceiveText();   //s = "3:los"   iss so ok...
         int stringlange = s.Length();   //stringlange = 5   auch ok...
         bla = s.Pos(":");              //bla bis : = 2    auch ok...
         ergebniss = stringlange - bla.Length();    //ergebniss = 4   auch ok...
         search = s.SubString(ergebniss.Length(), bla.Length());  //search = 3  :eek: WIESO????
    

    Definition von Substring sagt, das substring einen ANSISTRING

    ich werd irre



  • Schauen wir uns das doch einmal an:

    AnsiString s, ergebniss, search, bla;
    
         s = Socket->ReceiveText();   //s = "3:los"   iss so ok...
         int stringlange = s.Length();   //stringlange = 5   auch ok...
    

    Soweit ok... 😉

    bla = s.Pos(":"); // Pos gibt einen int Wert zurück, keinen String
         ergebniss = stringlange - bla.Length(); // String = integer - integer  Soll, bitte schön, was bewirken?
         search = s.SubString(ergebniss.Length(), bla.Length());  // Warum hier gerade 3 drin steht, keine Ahnung, aber auf jeden Fall auch niemals das richtige...
    
    AnsiString s, ergebniss,
         int pos, anzahlzeichen;
         s = Socket->ReceiveText();
         pos = s.AnsiPos(":");
         if (pos)
         {
            ergebniss = s.SubString(pos + 1, s.Length() - pos);
            anzahlzeichen = s.SubString(1,pos).ToIntDef(-1); // bei Fehler bei Konvertierung -1
         }
    

    So und jetzt möchte ich, dass Du mir erklärst was in meinem Code passiert. 🤡



  • ok....räusper...

    Joe_M. schrieb:

    [cpp]
         AnsiString s, ergebniss; -> anlegen ansistrings
         int pos, anzahlzeichen;  -> anlegen integer
         s = Socket->ReceiveText();  -> socket ne runde lesen lassen
         pos = s.AnsiPos(":");    -> nachschauen an welcher stelle das : steht und in pos schreiben
         if (pos)                 -> wenn pos gefüllt iss...
         {
            ergebniss = s.SubString(pos + 1, s.Length() - pos); -> alles vor dem string (längenangabe und :) wegschneiden
            anzahlzeichen = s.SubString(1,pos).ToIntDef(-1); -> auslesen des anzahl zeichen wertes vor dem :     
    }
    [/cpp]
    

    So und jetzt möchte ich, dass Du mir erklärst was in meinem Code passiert. 🤡

    Hoffe meine umgangssprache stört nicht...

    funktioniert auch wunderbar, nur das damit immernoch nicht mein problem gelöst ist...er baut immernoch einen doppel string wenn die verbindung zu langsam ist...sieht dann so aus: los9:127.0.0.1 soll aber 1x los und einmal 127.0.0.1 in eine meiner weiteren funktionen weitergeben...deswegen mach ich ja den ganzen umsatnd... bei fragen...steht alles in der historie oder ich schriebs gern nochmal



  • Natürlich solltest du die Längenangabe die du mitsendest schon auswerten (o: Mit der kannst du dann auch das definerte Stück rausschneiden...

    -junix


Anmelden zum Antworten