TUdpSocket OnReceive



  • Hi,

    habe hier ein Server und Client Programm.
    Der Server soll dem Client z.B. ne "1" per UDP senden (SendBuf), damit der Client weis, wann er die Datenbank neu einlesen soll.
    Der Server schickt also nach jeder Änderung in der DB eine "1" an den Client.
    Jetzt habe ich das Problem, das bei dem Client das OnReceive Event nicht ausgeführt wird wenn Daten ankommen, sondern erst wenn Daten angekommen sind.
    Wenn ich ReceiveBuf jede Sekunde ausführe, hängt meine Form...
    Habt ihr eine Idee?

    Infos:
    - Paradox DB
    - Borland Builder 6
    - WinXP Pro

    Vielen Dank!
    MfG, TLL.



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ThA-LaN-LaW schrieb:

    ...
    Jetzt habe ich das Problem, das bei dem Client das OnReceive Event nicht ausgeführt wird wenn Daten ankommen, sondern erst wenn Daten angekommen sind.
    ...

    Also wird es doch ausgelöst !?

    char Buff[1024];
    int j;
    UDP1->ReadBuffer(Buff,1024,j);
    Buff[j] = 0;
    
    //oder bei den Indys:
    
    char Buff[1024];
    UDP1->ReadBuffer(Buff,1024);
    

    Ich empfehle dir ein NMUDP Socket zu verwenden. Hatte mit den Indys auch nur Probs. Kein UDP Socket lief bei mir so zuverlässig wie das NMUDP. Verwende es bei dem "Server" und dem "Client".

    Edit #3: Wenn du schon dauernd ReceiveBuff aufrufst würd ich dir nen IndyAntiFreez empfehlen und die ganze Geschichte in nen extra Thread auszulagern. So funktioniert das bei dem IndyTCPClient bestens bei mir. Die VCL ist nicht thread-safe. Synchronize is dein Freund



  • Also wird es doch ausgelöst !?

    Muss ich passen, denn soweit habe ich erst gar nicht programmiert, denn ich will nicht, das die Form "hängt". Denn ReceiveBuf wartet ja bis was kommt.
    Unter VB gibt es was ähnliches, doch dort es das Event OnArrival, das wird ausgelöst sobald was ankommt. Und blokiert somit nicht den Rest.

    Ich versuche micht jetzt mal mit dem NMUDP.
    Gebe dann aber kurz Bescheid wie's aussieht 🙂

    Ein Beispiel wie der Server (sender) Teil und der Client (empfänger) Teil mit NMUDP aussieht, hast du zufällig nicht parat? 😉

    Vielen Dank und Gruß,
    TLL



  • Hi

    so, fertig 😉

    Hat mit NMUDP prima funktioniert!

    void __fastcall TFormClient::NMUDPEmpfDataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
      AnsiString C;
      int I;
      TMemoryStream *MyStream = new TMemoryStream();
      NMUDPEmpf->ReadStream(MyStream);
      C.SetLength(NumberBytes);
      MyStream->Read(&C[1], NumberBytes);
    
      I = StrToInt(C);
    
      if ( I == 1 ) {
        TableFahrzeuge->Refresh();
        TableProtokoll->Refresh();
      }
    

    Anfangs hatte ich vergessen den LocalPort zu setzen, dann kann es vorkommen das ne exception kommt oder einfach keine Daten ankommen...

    Nochmals Danke und Grüße, TLL



  • Prima ! btw: wie wäre es jetzt mit nem besseren Protokolldesign ?? 🤡
    Edit: Ups, du sendest und empfängst ein einzelnes zeichen via memorystream ??
    Schau dir mal nen Tutorial zu blocking und non-blocking Sockets an. ReceiveBuff liest vom Stack, egal ob was drin steht oder nicht.

    Local port?? Der Briefträger steht vor 5 Briefkästen die nicht beschriftet sind. Wohin kommt der Brief ??


Anmelden zum Antworten