Announcement

Collapse
No announcement yet.

Sockets : Problem mit der Synchronisation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sockets : Problem mit der Synchronisation

    Hallo,
    ich habe folgendes Problem: ClientSocket sendet die Daten an ServerSocket, ServerSocket schreibt die empfangenen Daten in der Methode ServerSocket1ClientRead() in MemoryStream und ruft ServerSocket1ClientWrite() auf. Dort wird es geprüft ob Datenblock im Stream vollständig ist. Wenn das der Fall ist, werden die Daten verarbeitet und an den Client zurückgesendet.
    Der Client soll warten, bis er die Daten vom Server bekommt. Die Daten werden wie beim Server in der Methode ClientSocket1Read() in den Stream geschrieben.

    Das Problem ist, dass wenn der Server die Daten zurücksendet, wird die ClientSocket1Read()- Methode beim Client nicht immer automatisch aufgerufen. Wenn ich die Methode explizit in einer Schleife aufrufe und prüfe dann ob Daten im Stream vollständig sind, klappt es auch nicht.
    Die beiden Sockets sind nicht blockierend.

    Wie kann ich beim Client erreichen, dass er auf die Daten vom Server wartet?

    MfG, Dennis

  • #2
    Wenn ClientType auf ctNonBlocking gesetzt wird, kann der Client-Windows-Socket auf asynchrone Schreib- und Lese-Ereignisse reagieren. Die Ausführung wird dabei nicht blockiert. OnSocketEvent-Ereignisse treten auf, wenn der Socket über die Verbindung Lese- und Schreibvorgänge abwickeln muß.

    Wenn die Eigenschaft dagegen auf ctBlocking gesetzt wird, verlaufen alle Lese- und Schreibvorgänge asynchron. Es empfiehlt sich dann, einen eigenen Thread dafür abzuspalten, um sicherzustellen, daß diese Operationen nicht die gesamte Ausführung der Client-Anwendung blockieren.

    Wenn ClientType auf ctBlocking gesetzt ist, verwenden Sie ein TWinSocketStream-Objekt zum Lesen und Schreiben. TWinSocketStream implementiert eine Zeitüberschreitungsabfrage, damit die Anwendung bei Schreib- oder Lesefehlern nicht vollständig angehalten wird. TWinSocketStream besitzt außerdem eine Methode, mit der das Lesen verzögert werden kann, bis die Socket-Verbindung bereit ist, Informationen zu senden.

    Verwenden Sie einen nicht blockierenden Socket immer dann, wenn Lese- und Schreibvorgänge mit den Server-Sockets synchronisiert werden müssen
    Christian

    Comment


    • #3
      Hallo Christian,
      bei mir muss die gesamte Client-Anwendung blockiert werden, bis der Client die Daten vom Server bekommt.
      Also muss ich Client auf ctBlocking setzen und die threads sind dann nicht notwendig?
      Wenn der Client blockierend ist, muss auch der Server blockierend sein?
      Wenn der Client die Daten mittels TWinSocketStream sendet, kann der Server die Daten mit SendText()/ReceiveBuf() senden bzw. empfangen?

      >Verwenden Sie einen nicht blockierenden Socket immer dann,
      >wenn Lese- und Schreibvorgänge mit den Server-Sockets
      >synchronisiert werden müssen.

      Das wollte ich eigentlich, aber ich weiß nicht wie ich die Synchronisation realisieren soll.
      Grüße
      Denni

      Comment

      Working...
      X