AnsiPos Problem
-
Guten Abend,
Ich habe ein dickes Problem. Über ein UDP Socket sende ich für ein Chat Tool den Username via Broadcast damit jeder Client in einem Subnet eine aktuelle Userliste verwalten kann. Alle 30sec sendet jeder Client seinen Username und löst somit ein OnReceive Ereignis auf jeder Station aus:
userlist ist eine TStringList
if (NumberBytes>-1 && NumberBytes<1024) { char Buff[1024]; int j,substring_laenge; String check; bool value = false; UDP1->ReadBuffer(Buff, 1024, j); Buff[j]=0; check = FromIP +" "+ String(Buff); int a = 1; while(a < check.Length()) { if (check[a] == ' ') { substring_laenge = a - 1; a = check.Length(); } a++; } //--Disconnect erkennen und aus Stringlist löschen if (check[check.Length()] == 'x' && check[check.Length() -1] == 'x') { for (int i = 0; i < userlist->Count; i++) { if (userlist->Strings[i].AnsiPos(FromIP.SubString(1,substring_laenge)) == 1) userlist->Delete(i); } } else { for (int i = 0; i < userlist->Count; i++) { if (userlist->Strings[i].AnsiPos(FromIP.SubString(1,substring_laenge)) == 1) { if (userlist->Strings[i] != FromIP +" "+ String(Buff)) userlist->Strings[i] = FromIP +" "+ String(Buff); value = true; } } if (value == false) userlist->Add(FromIP +" "+ Buff); userlist->Sort(); ListBox1->Clear(); ListBox1->Items->AddStrings(userlist); } }Warum wird in der StringListe trotz gleicher IP des Absenders bei jedem Senden ein neuer Eintrag erzeugt

Ich verwende doch schon AnsiPos um nur die Stellen zu aktualiseren wo bereits schon ein Eintrag vorhanden ist.Beispiel nach mehreren Broadcasts:
192.168.0.1 David
192.168.0.1 David
192.168.0.1 David
192.168.0.188 AlfonsKann mir jemand helfen ? Ich weiß momentan nicht weiter

David
-
Warum machst du mit der FromIp nen Substring?
if (userlist->Strings[i].AnsiPos(FromIP.SubString(1,substring_laenge)) == 1)Was steht denn in FromIp drin? Es gibt übrigens auch noch
bool __fastcall AnsiStartsText(const AnsiString ASubText, const AnsiString AText);Gib dir doch mal aus, was in FromIp drinsteht. Evtl. ist das ja auch falsch...
-
Ich habe mich jetzt nicht vollkommen durch Deinen Quelltext gelesen. Aber einen Vorschlag hätte ich auf jeden
Fall anzubringen.Anstatt die IP-Adressen und Benutzernamen so zu speichern:
Zero01 schrieb:
userlist->Add(FromIP +" "+ Buff);würde ich das so machen:
userlist->Values[FromIP] = Buff;Dann kannst Du anstatt
Zero01 schrieb:
for (int i = 0; i < userlist->Count; i++) { if (userlist->Strings[i].AnsiPos(FromIP.SubString(1,substring_laenge)) == 1) userlist->Delete(i); }einfach das schreiben:
int ipIndex = userlist->IndexOfName(FromIP); if (ipIndex >= 0) userlist->Delete(ipIndex);Vielleicht ist das dann auch einfacher zu debuggen und Du kommst dem tatsächlichen Fehler auf die Spur.
Gruß,
Alexander
-
-=]xXx[=- schrieb:
Warum machst du mit der FromIp nen Substring?
if (userlist->Strings[i].AnsiPos(FromIP.SubString(1,substring_laenge)) == 1)Was steht denn in FromIp drin?...........
Gib dir doch mal aus, was in FromIp drinsteht. Evtl. ist das ja auch falsch...War ne geistige Umnachtung von mir

Vielen Dank euch allen ! Super Infos !
So gehts 1A :
if (NumberBytes>-1 && NumberBytes<1024) { char Buff[1024]; int j; String check; UDP1->ReadBuffer(Buff, 1024, j); Buff[j]=0; check = String(Buff); //--Disconnect erkennen und aus Stringlist löschen if (check.SubString(1,2) == "N:" && check[check.Length()] == 'x') { int index = userlist->IndexOfName(FromIP); if (index >= 0) { ListBox1->Items->Delete(ListBox1->Items->IndexOf(userlist->Values[FromIP])); userlist->Delete(index); userlist->Sort(); } } else { if (check.SubString(1,2) == "N:") { check = check.SubString(3,check.Length()); if (userlist->Values[FromIP] != check) { ListBox1->Items->Delete(ListBox1->Items->IndexOf(userlist->Values[FromIP])); userlist->Values[FromIP] = check; ListBox1->Items->Add(userlist->Values[FromIP]); } } } }
-
Wenn ich mal eine OT-Frage einwerfen darf: Warum hast du eigentlich haufenweise Leerzeilen in deinem Code? Das bläht den Code doch nur auf und zum einfachen Lesen hilft das auch nicht unbedingt.
-
@Puppet:
Stimmt, guter Tip. Habe alles im Quelltext neu formatiert und läßt sich jetzt deutlich besser lesen