AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi To Block or not to Block. Frei nach WS
Thema durchsuchen
Ansicht
Themen-Optionen

To Block or not to Block. Frei nach WS

Ein Thema von Mavarik · begonnen am 22. Sep 2006 · letzter Beitrag vom 23. Sep 2006
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

To Block or not to Block. Frei nach WS

  Alt 22. Sep 2006, 08:10
Hallo Zusammen!

Ich arbeite hin und wieder mit der TSock Unit von Ward van Wanrooij. Hier steht im Header, dass für einen Server Blocking das richtige wäre...

Zitat von Ward van Wanrooij:
I strongly recommand against using non-blocking sockets for normal server applications,
see 'Using threads' in Delphi help.
Da ich nix in der Delphi Hilfe gefunden habe, hier die Frage:

Warum soll ich auf meinem Server pro Socket einen Thread mit Endlosschleife laufen lassen, wenn im non-Blocking bereich einfach gewartet werden kann, bis der event feuert? Oder habe ich da etwas falsch verstanden.


Frank
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: To Block or not to Block. Frei nach WS

  Alt 22. Sep 2006, 16:23
Push! Keiner ne Antwort oder Meinung?

Frank
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: To Block or not to Block. Frei nach WS

  Alt 22. Sep 2006, 17:47
Hallo Frank,

Zitat von Mavarik:
Warum soll ich auf meinem Server pro Socket einen Thread mit Endlosschleife laufen lassen, wenn im non-Blocking bereich einfach gewartet werden kann, bis der event feuert? Oder habe ich da etwas falsch verstanden.
kann es sein, dass du non-blocking mit asynchronous i/o verwechselst? Non-blocking heißt lediglich, dass dein Programm die Kontrolle sofort zurück erhält - das Ergebnis erhältst du später durch polling.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: To Block or not to Block. Frei nach WS

  Alt 23. Sep 2006, 00:16
Ja eben...bzw. nein

Blocking

Der Server startet für jede Verbindung einen eigenen Thread der in einer Endlosschleife wartet...

Delphi-Quellcode:
while NewSock.Connected do
    try
      Sleep(100);
      Command:=NewSock.ReceiveLine();
      //ReceiveLine returns when:
      // BlockingTimeout expires (return value=''), or
      // data has been received, but no full line (return value=''), or
      // data has been received, full line (return value=full line)
      if Command<>'then
      begin
        LogBox.Items.Insert(0, 'Receive: '+Command);
        if (UpperCase(Command)='DATE') then
          NewSock.SendLine(DateTimeToStr(Now))
        else if (UpperCase(Command)='QUIT') then
          NewSock.Close
        else
          NewSock.SendLine('Unknown or no command received. Valid commands are: DATE , QUIT');
      end;
    except
      on E:ESockException do LogBox.Items.Insert(0, 'Exception: '+E.Message);
    end;
Nonblocking

Der Server kann sich mit sich selber beschäftigen, bis der entsprechende event diese Procedure aufruft.

Delphi-Quellcode:
procedure TMainForm.MasterSockRead(Sender: TObject; Count: Integer);
var
  Command: String;
  NewSock: TSock;
begin
  NewSock:=(Sender as TSock);
  try
    Command:=NewSock.ReceiveLine;
    if (Length(Command)>0) then
    begin
      LogBox.Items.Insert(0, 'Receive: '+Command);
      if (UpperCase(Command)='DATE') then
        NewSock.SendLine(DateTimeToStr(Now))
      else if (UpperCase(Command)='QUIT') then
        NewSock.Close
      else
        NewSock.SendLine('Unknown command. Valid commands are: DATE , QUIT');
    end;
  except
    on E:ESockException do LogBox.Items.Insert(0, 'Exception: '+E.Message);
  end;
end;

Frank

(Aus den Beispielprogrammen)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: To Block or not to Block. Frei nach WS

  Alt 23. Sep 2006, 13:17
Hallo Frank,

Zitat von Mavarik:
Ja eben...bzw. nein

Blocking: Der Server startet für jede Verbindung einen eigenen Thread der in einer Endlosschleife wartet...
Nonblocking: Der Server kann sich mit sich selber beschäftigen, bis der entsprechende event diese Procedure aufruft.
wie immer entstehen ohne vorherige Begriffsbestimmungen die tollsten Missverständnisse. Ich beziehe mich auf Winsock 2 und du dich auf TSock. Ich kenne mehrere verschiedene socket i/o Techniken. Eine davon ist blocking und ist über jeden Definitionszweifel erhaben. Die anderen sind alle non-blocking. Wiederum davon wird der trivialste Modus als non-blocking bezeichnet (oft auch als pure non-blocking) und auf diesen bezog ich mich in meinem Beitrag. Die restlichen Modi bedürfen weiterer Erklärungen.

Ich habe mir die Unit TSock besorgt und mir den Code kurz angesehen. Ich komme zu dem Schluß, dass es sich um eine Implementierung von asynchronous sockets handelt. Dabei sendet der protocol stack eine message (WM_SOCK), wenn sich was tut.

Die bloße Warnung vor dem non-blocking mode in TSock ist vielleicht etwas ungeschickt, aber der Autor wollte wohl nicht zu sehr ins Detail gehen. Nach meinen Informationen bricht die server performance mit asynchronous sockets recht bald ein.

Während ich hier schreibe habe ich im Netz einen wunderschönen Artikel von Warren Young gefunden, der dir eine Klassifikation der unterschiedlichen i/o modes nahe bringt. Darüberhinaus geht er etwas tiefer auf die Wahl des richtigen Modus ein. Viel Spaß beim Studium.

Schönes Wochenende

marabu
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: To Block or not to Block. Frei nach WS

  Alt 23. Sep 2006, 13:59
Ja Danke!

Werde es gleich mal lesen...

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: To Block or not to Block. Frei nach WS

  Alt 23. Sep 2006, 15:41
Hi!

Netter Text, sagt im Prinzip alles...

Das Problem ist jetzt eine Komponetet zu finden die eine asynchronen Threadgetriebenen Transfer für den Server hinkriegt. Und dann noch eine Event gesteuerte Client Komponente. Scheint schwieriger zu sein...

Teste gerade die 4.

Grüsse Frank
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz