Erklärung zu SendBuf (war : SendBuf)



  • Ich hätte eine bitte! Kann mir jemand den Befehl SendBuf mal genau erklären? Ich habe den nich so ganz kapiert, aber bräuchte ihn. Da zum Teil die Borlandhilfe auch noch auf englisch ist, wird die verwirrung noch größer...

    vielen Dank

    /Edit : Bitte aussagekräftigeren Thematitel wählen



  • Hallo

    Was gibt es da zu erklären? Es wird statt dem normalen AnsiString (SendText) eben ein Bytearray verschickt. Der Start wird durch Buf gekennzeichnet, die Größe in Bytes bzw. die Anzahl der Zeichen durch Count.

    bis bald
    akari



  • Ich versteh nicht ganz wie ich den einsetzen muss:

    Ich habe die Anzahl der User in einem Chat als Variable gespeichert,
    die ich dann über SendBuf an die Clienten übetragen will.

    Was muss ich dazu machen?

    Nehmen wir mal an die Variable sei int a;

    (für a<10)

    ServerSocket1->Socket->SendBuf(a,1);
    

    aber das geht ja nicht. wie muss in diesem fall der befehl genau lauten?
    Das heißt, was muss ich in die Klammern schreiben?

    Nico



  • Hallo

    Diese Funktion ist in erster Linie dazu um binäre Daten zu übertragen. Vermutlich ist es für dich einfacher den Integer einfach als String zu senden

    SendText(IntToStr(a));
    

    Wenn du den Integer unbedingt binär übertragen willst (da du ansonsten keine anderen binären Daten zu senden scheinst ist das bei dir sicher nicht notwendig) must du eben casten

    SendBuf(reinterpret_cast<void*>(&a), sizeof(a));
    

    Auf jedenfall must du natürlich genauso empfangen wie du sendest und dieser Steuerwert muß auch durch dein Anwendungsprotokoll definiert werden, um besondern behandelt zu werden.

    bis bald
    akari



  • Das Problem: Ich sende über SendText schon den Chatinhalt, das heißt, dann würde die Anzahl der Chatter plötzlich im RichEdit stehen. Ich will sie aber in einem Label stehen haben.
    Das heißt ich muss wohl auf die zweite Lösung zurückgreifen.

    Das heißt ich empfange so?

    ClientSocket1->Socket->ReceiveBuf(reinterpret_cast<void*>(&a), sizeof(a))
    Label7->Caption= "User online: " + a;
    


  • Hallo

    genau das hilft dir da nicht weiter, denn im On...Read-Event weiß der Emfänger ja nicht, ob SendText oder SendBuf vom Sender benutzt wurde. Das wird nur durch den Kontext klar, der durch ein von dir festgelegtes Protokoll definiert wird.
    Einfaches Beispiel :
    Der Server sendet Text normal mit SendText, den UserCount durch

    SendText(AnsiString("USERCOUNT:") + IntToStr(a));
    

    Im Event der Clients muß jetzt also der Text wieder überprüft werden

    AnsiString Text = ...;
    if (Text.Pos("USERCOUNT:") == 1) // Usercount wurde gesendet
    {
      Text.Delete(1, 10);
      int a = StrToInt(Text); 
      ... // Usercount weiter verarbeiten
      return;
    }
    ...
    // Normalen Text weiterverarbeiten
    

    Das hätte noch den kleinen Schönheitsfehler, das auch durch Benutzereingaben ein Usercount-Versand vorgetäuscht werden könnte. Deshalb werden normalerweise alle Usereingaben noch gekapselt (gequotet), um Steuerdaten zusätzlich und außerhalb Userreichweite übertragen zu können.

    bis bald
    akari



  • cool danke, jetzt bin ich schlauer, werde mich gleich dransetzen.

    theoretisch könnte man ja auh einfach usereingaben mit USERCOUNT verbieten.

    ich probiers aus! Nico



  • Habe alles eingefügt, klappt aber noch nicht, im RichEdit kommt es so raus:

    Nico (16:25) : HiUSERCOUNT: 1

    Das ist mein Code:

    im Clienten:

    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    AnsiString Text = ClientSocket1->Socket->ReceiveText();
    
    if (Text.Pos("USERCOUNT:") == 1) // Usercount wurde gesendet
    {
      Text.Delete(1, 10);
      int a = StrToInt(Text);
      Label7->Caption = "User online: " + a ;
      return;
    }
    
    else
    {
    RichEdit1->Lines->Add (Text);
    RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
    if (Frame41->CheckBox1->Checked == true)
    MediaPlayer1->Play();
    if (c==1)
    FlashWindow(Application->Handle,true);
    }
    }
    

    und im Server

    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    int x;
    RichEdit1->Text = Socket->ReceiveText();
    RichEdit3->Text = RichEdit3->Text + " \n" + RichEdit1->Text;
    int Verbindungen = ServerSocket1->Socket->ActiveConnections;
         for(int x = 0; x <= Verbindungen - 1; x++){
           ServerSocket1->Socket->Connections[x]->SendText(RichEdit1->Text);
           ServerSocket1->Socket->Connections[x]->SendText(AnsiString("USERCOUNT:") + IntToStr(a));
           }
    
    RichEdit3->Lines->SaveToFile(SaveDialog1->FileName);
    }
    


  • So, wie ich das sehe, sendest Du den Text des Benutzers unmittelbar vor dem USERCOUNT, was soviel heißt, daß zweiteres vermutlich ankommt, bevor ersteres verarbeitet ist. Frage statt dessen lieber ab, ob USERCOUNT irgendwo im Text steht, nicht nur an erster Stelle. Dann mußt Du nur darauf achten, daß Du eventuellen Text vor USERCOUNT auch weiterverarbeitest.

    ... oder Du drehst einfach die Sendereihenfolge um 😉

    Gruß,
    Christian



  • Leider funktioniert das nicht so ganz wie ich will...
    wenn alles gut läuft, funktioniert es, es gibt allerdings phasen, da schmeißt er wieder alles durcheinander.

    Gibt es noch irgendeine andere Möglichkeit, bzw. etwas, dass das System verstärkt?



  • Hi,
    Welche der Lösungsvorschläge hast Du denn benutzt? Wenn es der zweite war, könnte es (aufgrund schlechter Übertragungszeiten) auch dazu kommen, daß ein USERCOUNT ankommt, bevor der vorher gesendete Text abgearbeitet ist und dadurch dann nicht an erster Stelle steht.

    Am sinnvollsten wäre aber vermutlich, wenn Du (wie Akari schrieb) die Usereingaben kapselst. Bei zeichenweisem Vergleich kannst Du dann eine bool'sche Variable bUserText auf true oder false setzen. Sobald sie auf false steht, kannst Du den nachfolgenden Text (also ab Position 1) mit USERCOUNT - gerne auch mit anderen Schlüsselwörtern - vergleichen und die gewünschten Maßnahmen ergreifen.
    Gruß,
    Christian


Anmelden zum Antworten