Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 14.03.03 20:54 
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~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: Fr 14.03.03 22:43 
Hi,

sobald der Indyserver Daten empfängt, wird das OnExecute ausgelöst:

ausblenden 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:

ausblenden 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:

ausblenden 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):

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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

_________________
Aya
I aim for my endless dreams and I know they will come true!
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Sa 15.03.03 00:03 
mh... also ich bekomm immer Fehler mit der IndyKompo...

wenn ich z.B.
ausblenden 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:

_________________
Aya
I aim for my endless dreams and I know they will come true!
Savage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: Sa 15.03.03 09:48 
hmm
Probier doch einfach mal das hier:

ausblenden 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
Hält's aus hier
Beiträge: 16



BeitragVerfasst: 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

ausblenden 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