Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 08, 2025 18:03

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [erledigt]Indy 10
BeitragVerfasst: Mo Mär 22, 2010 07:54 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Hallo,

ich habe in mein Projekt für die Kommunikation zwischen Client und Server Indy 10 eingesetzt. Nach dem die Code sich vergrössert, hat auch folgendes problem angefangen.

Der Client und der Server kommunizieren, wenn sie Lust haben :-) na, ja also die Daten gehen manchmal verloren. mach mal funktioniert es aber ohne Probleme.

woran kann das liegen?

Der Server liest:
Code:
procedure TserverGUI.onExecute(ctx : TIDContext);
var
    msg : TMSGType;
begin
   SleepEx(1, true);
   Application.ProcessMessages;

   user := userList.getUser(ctx);
        IO := user.Connection.IOHandler;

        if IO.InputBufferIsEmpty then
        begin
          IO.CheckForDataOnSource(10);
          if IO.InputBufferIsEmpty then Exit;
        end;

        IO.InputBuffer.ExtractToBytes(user.loginBytes, -1, false, -1);
                 BytesToRaw( user.loginBytes , msg, sizeof (TMSGType) );
       handleMsg(user, msg);
end;


und schickt:
Code:
  Buffer := RawToBytes(msg, Sizeof(TMSGType));
  user.Connection.IOHandler.Write(Buffer, Sizeof(TMSGType));


Der Client liest:
Code:
IO := TCPClient.IOHandler;

        if IO.InputBufferIsEmpty then
        begin
          IO.CheckForDataOnSource(10);
          if IO.InputBufferIsEmpty then Exit;
        end;
  tcpClient.IOHandler.InputBuffer.ExtractToBytes(Buffer, -1, false, -1 );
  BytesToRaw( Buffer , msgItem, sizeof (TMSGType) );


und schickt :
Code:
   Buffer2 := RawToBytes(msg, sizeof (TMSGType) );
   TCPClient.IOHandler.Write(Buffer2);


EDIT:
Also, der Server bekommt die erste Nachricht und bearbeitet damit immer richtig. Aber wenn er antwortet, liest der Client mach mal nicht!


Zuletzt geändert von BawerPower am Mo Mär 22, 2010 17:31, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Indy 10
BeitragVerfasst: Mo Mär 22, 2010 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Wenn du die TCP-Komponenten benutzt können keine Daten verloren gehen, denn TCP fängt das selbst ab.

Was ich mir vorstellen kann ist, dass wenn du nur sehr wenige Bytes schickst, der WriteBuffer die Daten zwar enthält, sie aber nicht abgeschickt werden. Schau mal nach, ob es eine Funktion gibt, mit der man das Buffering abschalten kann bzw. den Buffer leeren kann.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Indy 10
BeitragVerfasst: Mo Mär 22, 2010 17:31 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Zitat:
Schau mal nach, ob es eine Funktion gibt, mit der man das Buffering abschalten kann bzw. den Buffer leeren kann

Ja es gibt dafür in der Klasse TIdTCPClient.IOHandler.InputBuffer die methode Clear, und für das Versand in der Klasse IOHandler die Methode WriteBufferClear.
Leider auch mit der beiden keinen Erfolg!

Das Problem war genau so: Der Klient hatte die Antwort vom Server in InputBuffer, aber konnte er irgendwie nicht merken, um zu starten, zu lesen. erst Nach der Starten des procedur für die Abbau der Verbindung, merkte er, dass was in Inputbuffer ist. Nach Lesen wird ja sowieso die Verbindung getrennt. wie gesatgt, das komisches war, dass das nicht regelmässig aufgetroffen war, daher zu debuggen auch sehr schwierig war.

Nach dem ich den TCP-Client in ein Thread die Daten dauernd lesen lässt, funktioniert die Receiving wieder einwandfrei, da er immer wieder Inputbuffer lesen muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [erledigt]Indy 10
BeitragVerfasst: Di Mär 23, 2010 08:43 
Offline
DGL Member

Registriert: So Feb 07, 2010 21:15
Beiträge: 30
Ich bin mir nicht sicher aber ich glaube dein Sleep ist in deiner Execute Prozedur nicht so gut aufgehoben.
Ich weiß nicht ob das was damit zu tun hat oder ob das jetzt total falsch ist was ich sage aber ich habe das noch nie gesehen, da ein sleep reinzupacken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [erledigt]Indy 10
BeitragVerfasst: Di Mär 23, 2010 17:46 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Bl4cksh4rk hat geschrieben:
Ich weiß nicht ob das was damit zu tun hat oder ob das jetzt total falsch ist was ich sage aber ich habe das noch nie gesehen, da ein sleep reinzupacken.

In einem Thread sollte man lieber beide funktionen nutzen (sleep und application.processmessages). ohne sie würde auch funktionieren.
Aber das problem ist, wenn man nicht sleep reinpackt, sieht man am meistens übe %50 CPU-Auslastung in Task-Manager.
wenn man nur Sleep reinschreibt, dann blockiert die Anwendung manch mal Messagesverkehr, so wie bei TTimer kann OnTimer-Event gar nicht aufgerufen werden. dafür ist Application.ProcessMessages da. sie sehen so kleinigkeiten aus, aber haben richtig grösse Beeinflus für die Anwendung.

bei Java ist das ja auch so, wenn man Thread nutzt, sollte man auch ein Sleep reinpacken, um CPU-Auslastung zu verkürzen.

ich dachte auch, dass Indy dieses schon in Komponenten drin implementiert hat, da in TIDTCPServer Thread schon implementiert ist. war aber nicht so. vielleicht gibt es dafür auch eine spezielle methode in Indy, was ich übersehen habe. Aber das Timer-Problem hat mich getroffen, und menge zeit gebracht raus zu finden


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]