Hilfe mit zu schnellen Daten
-
Hallo!
Ich habe eine funktion (on client read eines ClientSocket) die immer angestosen wird wenn der socket readed. darin wird alles was kommt in eine string geschrieben.
leider kommt manchmal so schnell was an, das einige strings zusammengewürfelt gespeichert werden.
nu würde ich gern eine funktion oder so haben, die mir alle einzelnd ankommenden strings in eine art array oder so etwas schreibt und mir dann einzelnd wieder in mein memofeld ausgebt ,nur halt ohne die zusammenwürfelllungen...
Hat da jemand eine idee??
danke im voraus!!Code:
Void __fastcall TForm1::ClientRead(Tobject Sender, TCustomWinSocket *Socket)
{
String s;
s= Socket->ReceiveText(); <- genau diese Daten, die hier ankommen, sind manchmal zusammengeschustertListBox->Items->Add(s); <- sollen dann aber hier ohne fehler rein...
}
-
Schau dir mal in den FAQ den Beitrag über Protokollentwicklung an...
-junix
-
habe das jetzt mal asprobiert, und es funktioniert soweit auch ganz ordentlich, bis auf die tatsache, das er dann die werte die zusammengechustert waren abschneidet und wegwirft...
mir fehlen dann also 1-3 einträge...
ne idee oder gar nen paar zeilen beispielcode??
bin leider nicht so clever
-
Darkwing schrieb:
habe das jetzt mal asprobiert, und es funktioniert soweit auch ganz ordentlich, bis auf die tatsache, das er dann die werte die zusammengechustert waren abschneidet und wegwirft...
Wer zur Hölle ist "er"?
Darkwing schrieb:
bin leider nicht so clever
Och komm... nu stell dein Licht mal nicht so unter den Scheffel...Das wichtigste ist nicht aufzugeben...
-junix
-
mit "er" war der socket oder wer auch immer mene werte verschluckt gemeint...
problem ist, das ich schon betriebsblind bin...sitze an der sch.... schon so lange das ich den wald nicht vor lauter bäumne sehe...
versuche echt nur noch blödsinn...
also, wenn du nen bssel quellcode hättest, der helfen könnte....ich würds dir echt danken....bitääääääääääääääää
-
Der Socket schluckt gar nix... alles was Daten schlucken könnte wäre deine Empfangsroutine... Statt nach Quellcode zu betteln würdest du besser mal Zeigen wies im Moment aussieht.
-junix
-
so langsam kommt mir der verdacht, das du hoffst/glaubst, das ich das allei hinbekomme...dein vertrauen rühmt dich...werde mal schauen was ich hier reinsetzen kann....bin aber grad wieder aufm anderen weg...mal sehen was du dazu sagst...
Also:Serverseite:
void __fastcall TForm1::ServerIPClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
zaehler++;
for(int y=0; y<zaehler; y++)
{
String a = "los";
buff = a.c_str();
ServerIP->Socket->Connections[y]->SendBuf(buff,a.Length());
for(int x=0; x<zaehler; x++)
{
String a = ServerIP->Socket->Connections[x]->RemoteAddress;
buff = a.c_str();
ServerIP->Socket->Connections[y]->SendBuf(buff,a.Length());
}
}
}Clientseite:
void __fastcall TForm1::ClientIPRead(TObject *Sender,
TCustomWinSocket *Socket)
{
//String s;
String s[30];
//s = Socket->ReceiveText();
int length = Socket->ReceiveLength();
Socket->ReceiveBuf(s,length); Hier liegt das dilema mal wieder in dieser version
for (i = 0;i < length;++i)
if (s[i] >= 1 && s[i] <= 9)
{
if(s[i] == "los")
{
ListBox1->Clear();
ListBox1->Items->Add("Alle");
}
if(s[i] == "kill")
{
ClientText->Socket->Disconnect(0);
ClientIP->Socket->Disconnect(0);
}
if(s[i] != "kill" && s[i] != "los")
{
ListBox1->Items->Add(s[i]);
}
}
}
-
Mal ne Frage: Warum nutzt du nicht ServerIP->Socket->Connections[i]->SendText(a);?? Dann ersparst du dir auch das umwandeln in cahr*

Ach was ich veragrß zu erwähnen: Schau dir mal das Chat-Beispiel im %BCB%\Examples Ordner an
-
send text(a) hat das problem, das das proggi die daten nicht komplett oder defekt beim client abliefert...steht aber alles im davorliegenden thema.
junix hatte eine idee in den faq beschriebn, die ich leider nicht ganz in der lage bin nachzubasteln...aus diesem grund bin ich hier!ich habe schon eine umfangreiche chattversion gechriebn, aber die hat datenverluste...und die verscuhe ich zu beheben!...
fällt dir was dazu en?
-
Aber sag mal... du machst ja gar nicht das was in der FAQ beschrieben steht mit dem Protokoll?!?
-junix
-
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 gehtvoid __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