ListIndex aller Server im Lan



  • Hi leute, hab folgendes Problem:

    Alle Server senden per UDP Broadcast ihren aktuellen Status, der Client nimmt die Pakete (siehe Quelltext) an. Jetzt soll in einer TStringList die Absender IP´s aller Server aufgeführt werden und bei jedem erneuten paket der Gleiche reservierte Platz in der Liste überschrieben werden. Die Listeneinträge werden dann in eine ListBox (sorted) übertragen.

    Verhalten: Startet man den Server alleine tut es seinen Dienst, startet man einen 2ten Server bleibt die eigene IP in der Liste stehen und die einträge des 2ten Server werden trotz DupIgnore weiter und weiter eingefügt (list->add())
    Sieht dann so aus:
    192.168.6.4 | idle
    192.156.6.5 | Clients: 0
    192.156.6.5 | Clients: 0
    .
    ..
    Aktualisierungen wie z.B 192.156.6.5 | Clients: 1
    werden zwar immer korrekt angezeigt aber laufen immer weiter die Liste runter wie oben beschrieben.
    Ab 3 Server gibts nen dicken fetten Fehler das ein Eintrag nicht hinzugefügt werden kann 😕

    Wo ist mein Denkfehler ? Hat jemand einen Rat ?

    void __fastcall TForm1::UDP1DataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
      if (NumberBytes>-1 && NumberBytes<30)
        {
            char Buff[30];
    
            int j,listindex,st;
            String check;
    
            UDP1->ReadBuffer(Buff, 30, j);
            Buff[j]=0;
    
            list->Duplicates=dupIgnore;
            list->Add(FromIP);            //Stringlisteintrag für jede IP 
            list->Sort();
    
            listindex = list->IndexOf(FromIP);
    
            Form1->ListBox1->Items->Strings[listindex] = FromIP + " "+ Buff;
    
            //Wenn Client "Closed" sendet soll der Eintrag gelöscht werden
            check = FromIP + " "+ Buff;
            st = strlen(check.c_str());
    
            if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s')
            {
             listindex = list->IndexOf(FromIP);
             list->Delete(listindex);
             Form1->ListBox1->Items->Delete(listindex);
            }
    
       }
    }
    


  • Hab ne neue Idee, wie wäre es wenn ich alle Client Status Einträge in einer TString Liste verwalte und die gesammte liste bei jedem update via listBox1->AddStrings komplett kopiere und listBox1->Sorted() auf false setze. Was meint ihr ?



  • enum TDuplicates {dupIgnore};
            list->Duplicates;
            list->Add(FromIP); //Stringlisteintrag für jede IP reservieren, klappt nicht
            list->Sort();
    
            if (list->Find(FromIP, listindex))
        {
           ListBox1->Items->Insert(listindex,FromIP + " "+ Buff);
        }
    

    Und zum Löschen:

    check = FromIP + " "+ Buff;
            st = strlen(check.c_str());
    
            if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s')
            {
             listindex = list->IndexOf(FromIP);
             list->Delete(listindex);
             ListBox1->Items->Delete(listindex);
            }
    

    Warum bekomme ich in der listBox dauernd doppelte Einträge, sieht jemand noch ein Problem ? Bin euch wie immer super dankbar mir beim lernen zu Helfen !

    Die Idee mit dem übergeben als Objekt hab ich wieder verworfen weil es dann ndere Probleme mit den Parametern gibt



  • void __fastcall TForm1::UDP1DataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
    
     const TStringList *temp  = new TStringList;
     const TStringList *list  = new TStringList;
    
      if (NumberBytes>-1 && NumberBytes<1024)
        {
            char Buff[1024];
    
            int j,index,st;
            String check;
    
            UDP1->ReadBuffer(Buff, 1024, j);
            Buff[j]=0;
    
            temp->Duplicates = dupIgnore;
            index = temp->Add(FromIP);
            temp->Sorted = true;
    
            if (temp->Find(FromIP,index))
           {
            list->Insert(index,FromIP +" "+ Buff);
    
            Form1->ListBox1->Clear();
    
            Form1->ListBox1->Items->AddStrings(list);
    
           }
    
            //----------------------------
    
            check = FromIP + " "+ Buff;
            st = strlen(check.c_str());
    
            if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s')
            {
             list->Delete(index);
             Memo2->Lines->Add(FromIP +": Session 2004 geschlossen");
            }
    
       }
    }
    

    Selbst bei diesem Versuch schreibt er fortlaufen mit der gleichen IP (FromIP) die Liste runter und bleibt bei gleicher IP nicht im gleichen Index ob wohl Duplikate verboten wurden, woran kann das liegen -bin am verzweifeln 😞
    Ich vermute aber das es an list liegt.



  • Zero01,

    Zero01 schrieb:

    Wo ist mein Denkfehler ? Hat jemand einen Rat ?

    ...
            list->Duplicates=dupIgnore;
            list->Add(FromIP);            //Stringlisteintrag für jede IP 
            list->Sort();
            ...
    

    CB-Hilfe schrieb:

    Note: Duplicates does nothing if the list is not sorted.

    Ich vermute, daß heißt nicht, daß Du die String-Liste sortieren sollst, sondern, daß Sie sortiert sein muß, wenn Du neue Items einfügst.

    list->Sorted = true;
        list->Add(FromIP);
    


  • Ich habes jetzt mal so umgestellt und es geht immer noch nicht:

    if (NumberBytes>-1 && NumberBytes<1024)
        {
            char Buff[1024];
    
            int j,index,st;
            String check;
    
            UDP1->ReadBuffer(Buff, 1024, j);
            Buff[j]=0;
    
            temp->Duplicates = dupIgnore;
            temp->Sorted = true;
            index = temp->Add(FromIP);
    
            if (temp->Find(FromIP,index))
           {
            list->Insert(index,FromIP +" "+ Buff);
    
            Form1->ListBox1->Clear();
    
            Form1->ListBox1->Items->AddStrings(list);
    
           }
    
            //----------------------------
    
            check = FromIP + " "+ Buff;
            st = strlen(check.c_str());
    
            if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s')
            {
             list->Delete(index);
             Memo2->Lines->Add(FromIP +": Session 2004 geschlossen");
            }
    
       }
    

    ich bekomme immer fortlaufend einen Eintrag in die listBox hinzugefügt sobald die routine einmal durchlaufen wird. hab keine Ahnung woran es liegen soll da der Index bei gleicher IP sich nicht ändert:

    192.168.6.4 Index = 0
    192.168.6.4 Index = 0
    192.168.6.4 Index = 0
    192.168.6.5 Index = 1
    192.168.6.5 Index = 1

    Hab echt keine ahnung warum 😕



  • Zero01,

    Zero01 schrieb:

    Ich habes jetzt mal so umgestellt und es geht immer noch nicht
    ...
    Hab echt keine ahnung warum 😕

    index = temp->Add(FromIP);
    if (temp->Find(FromIP,index))
    

    Du prüfst überhaupt nicht, ob tatsächlich ein neuer String hinzugefügt wurde.
    Wenn der String schon existiert, gibt "Add" den Index des bereits existierenden Strings zurück. Deine if-Bedingung ist immer wahr. Das ganze ist also bloß ein Ausgabe-Problem.
    Für so etwas gibt es den Debugger, mit dem Du z.B. die Anzahl der Strings in der Liste hättest überwachen können.



  • Das die Anzahl der Strings wächst war schon klar aber Danke das du mir in diesem punkt die Augen geöffnet hast. Stimmt, ein dicker logischer Fehler. Habe die ganze angelegenheit bereits so gelöst:

    void __fastcall TForm1::UDP1DataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
    
      if (NumberBytes>-1 && NumberBytes<1024)
        {
            char Buff[1024];
    
            int j,index,st;
            String check;
            bool value = false;
    
            UDP1->ReadBuffer(Buff, 1024, j);
            Buff[j]=0;
    
            for (int i = 0; i < list->Count; i++)
            {
              if (list->Strings[i].AnsiPos(FromIP) == 1)
              {
              value = true;
              list->Strings[i] = AnsiString(FromIP +" "+ Buff);
              }
            }
    
            if (value == false)
            list->Add(FromIP +" "+ Buff);
            list->Sort();
    
            Form1->ListBox1->Clear();
    
            Form1->ListBox1->Items->AddStrings(list);
    
            //-------------Disconnect erkennen und aus stringlist löschen
            check = FromIP + " "+ Buff;
            st = strlen(check.c_str());
    
        if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s')
       {
    
          for (int i = 0; i < list->Count; i++)
            {
              if (list->Strings[i].AnsiPos(FromIP) == 1)
              {
              list->Delete(i);
              Memo2->Lines->Add(FromIP +": Session 2004 geschlossen");
              list->Sort();
              }
            }
    
       }
      }
    }
    

    Danke !



  • Zero01,
    noch eine kleine Randbemerkung: Du demotivierst den geneigten Forum-Besucher sich mit Deinem Problem zu beschäftigen, wenn Du lange und überwiegend irrelevante Code-Abschnitte in den Beitrag kopierst.



  • Eventuell erschlägt sich dein Duplikat-Problem auch mit dem von mir hier vorgeschlagenen Vorgehen?

    -junix


Anmelden zum Antworten