Entwickler-Ecke
Internet / Netzwerk - Verlorengegangene Pakete...
Aya - Fr 14.03.03 20:54
Titel: Verlorengegangene Pakete...
Hi,
ich hab nen problem...
Bei mir gehen dauernd Packete im Netzwerk verloren, selbst wenn ich den Clienten was an den Server auf 127.0.0.1 (also Lokal) schicken lasse...
Am Clienten liegt es 100%ig nicht, denn der versendet alles...
aber, als Server benutz ich einen TServerSocket (aus der "Internet" Spalte), und der scheint nich damit klarzukommen wenn ganz schnell ganz viele Messages kommen...
Wenn ich z.B. 100 Nachrichten (á 255 Zeichen) schicke mit gewissen Zeitabstand geht es... wenn ich die in einer For-Schleife direkt nacheinander alle abschicke, is bei Nachricht Nr. 38 schluss :cry:
ich hab mal diese IndyKompo versucht, aber damit komm ich net klar irgendwie... durch AThread.AllData bekomm ich zwar alle 100 Nachrichten, aber irgendwie auch automatisch gratis dazu eine AcessViolation *g*
Wär super wenn mir wer helfen könnte... :)
Au'revoir,
Aya~
Savage - Fr 14.03.03 22:43
Hi,
sobald der Indyserver Daten empfängt, wird das OnExecute ausgelöst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TFormx.IdTCPServer1Execute(AThread: TIdPeerThread); var Msg : String; begin Msg := athread.Connection.ReadLn('',5); if Msg = '' then exit // nix angekommen ... end; |
Wenn der Server an alle senden will:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var list : TList; count : integer; msg : String; begin
msg := .... ... try List := idtcpServer1.Threads.LockList;
for Count := 0 to List.Count -1 do try TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg); except TIdPeerThread(List.Items[Count]).Stop; end; finally idtcpServer1.Threads.UnlockList; end;
... |
Wenn der Client senden will:
Quelltext
1: 2: 3: 4:
| try idtcpclient1.WriteLn('Hello World'); except {irgendwas funzt nicht} end; ... |
Wenn der Client empfängt (bei mir in einer Timer-Kompo mit 200 ms Intervall):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var msg : string; begin try if not idtcpclient1.Connected then exit;
msg := idtcpclient1.ReadLn('',5); if msg = '' then exit; ... except {irgendwas funzt nicht} end; end; |
Ich hoffe ich konnte helfen :)
Mfg
Savage
Aya - Fr 14.03.03 22:49
Hi,
danke erstmal :)
Aber eine frage noch...
ich benute ja als Clienten nicht die Indy Komponente, da der Client NonVCL is... :)
Aber, beim IndyServer gibt es ja div. einstellungen zu tun...
z.B. "Bindings".. muß ich da was eintragen?? wenn ja, was..? die IP von jedem Clienten der evtl. Connecten könnte...?
Ich brauch den Server ja nur um Daten zu empfangen, senden soll er garnich können... gibt's da evtl ne bessere Kompo als Indy??
Au'revoir,
Aya
Savage - Fr 14.03.03 23:04
Bei Bindings hab ich bei mir nochmal den Port eingetragen (aber mit Doppelpunkt davor)
z.B.: Port 80
Bindings :80
Wenn du Bindings zur Laufzeit eintragen willst, verwende folgendes:
Quelltext
1:
| idtcpserver1.bindings.DefaultPort := 80; |
Ich kann dir den IndyServer nur empfehlen, da er für jede Verbindung nen Thread aufbaut. Anhand der ThreadId kannst du dann die Verbindungen auseinander halten. Und bei mir hat er bisjetzt auch wunderbar gearbeitet. (nix verloren gegangen oder so)
Ich würde dir empfehlen, auch den Clienten auf Indybasis zu programmieren. -> Geht auch NonVCL. --> musst halt ein bischen was per hand createn und destroyen.
Es kann auch durchaus sein, das der TClientsocket die Daten "verschwinden" lässt. War bei mir auch passiert - deshalb Indy :)
Mein Server z.B. arbeitet mit IdTcpserver als Konsolenanwendung und läuft perfekt auf einen Linux-Server :)
MfG
Savage
Aya - Sa 15.03.03 00:03
mh... also ich bekomm immer Fehler mit der IndyKompo...
wenn ich z.B.
Quelltext
1:
| Memo1.Lines.Add(AThread.Connection.AllData); |
mache bekomm ich dauernd nen Fehler: "RichEdit line insertion error."
KA was das für nen fehler is, hatte ich nochnie bisher... :cry:
Savage - Sa 15.03.03 09:48
hmm
Probier doch einfach mal das hier:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TFormx.IdTCPServer1Execute(AThread: TIdPeerThread); var Msg : String; begin Msg := athread.Connection.ReadLn('',5); if Msg = '' then exit // noch nichts da... memo1.lines.add(msg); ... end; |
Mit AllData hat es bei mir auch nicht gefunzt, aber das ReadLn('',5) funzt :)
MfG
Savage
Dj_GL - Mi 19.03.03 22:54
Wenn ich dich recht verstehe verwendest du am Client nen TClientSocket ...
Vermutlich sendest Du die Daten dann einfach mit ClientSocket.Socket.SendText('blablabla');
Naja das ist leider einer der Irrglauben das der ClientSocket dann versucht alle Daten sauber zum Server zu senden ;-)
Also zum Senden folgende Funktion verwenden
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure SendText(Socket:TCustomWinSocket;Text:string); begin try while (Socket.Connected) and (Socket.SendText(Text)=0) do begin application.processmessages; end; except end; end; |
Dies reicht für die meisten Übertragungen aus ...
Gibt noch spezielle Lösungen ... eine davon hab ich entwickelt ;-) ... falls Du sowas brauchst einfach per Mail melden .... =>
webmaster@gleitgeb.at
MFG
Dj_GL
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!