AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert
Thema durchsuchen
Ansicht
Themen-Optionen

Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

Ein Thema von Trusti75 · begonnen am 26. Jul 2010 · letzter Beitrag vom 27. Jul 2010
Antwort Antwort
Trusti75

Registriert seit: 17. Dez 2006
7 Beiträge
 
#1

Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 26. Jul 2010, 16:27
Hallo,
ich arbeite mit Delphi 2009 und verwende den Indy-TCP-Server zur Kommunikation mit mehreren Clients. Diese Clients schicken nun willkürlich Daten bzw Anfragen, auf die der Server reagieren soll.
Das tut er auch. Hierfür werte ich im Execute-Event des Servers die Informationen aus und entscheide, was passiert. Entweder wird ein Datenpaket geschnürt und dem gleichen Client zurückgegeben, oder es wird nur die Anfrage nur quittiert. Meldet sich wärend der Zeit der Bearbeitung zufälligerweise ein andere Client, dann bricht der Server das Execute-Event ab und beginnt mit der Abarbeitung dieser Anfrage. Nun meine Frage: Kann man verhindern, dass die Anfrage das Execute-Ereignis abbricht, sondern wartet? Bei vielen Clients kommt es immer wieder vor, dass sich einer meldet, aber der andere noch nicht fertig bearbeitet wurde.
Ich hoffe, es hat jemand einen Tip.

Grüsse
Michi
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 26. Jul 2010, 17:03
Das tut er nicht das ist nur der Debuger
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Trusti75

Registriert seit: 17. Dez 2006
7 Beiträge
 
#3

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 08:56
>> Das tut er nicht das ist nur der Debuger <<

hmm.... ich hab ein Logfile mitlaufen, was alles mitschreibt und das sagt mir auch, das er das "Execute" des Servers abbricht und neu beginnt, sobald ein Client sich meldet. Was hat der Debugger damit zu tun?

Grüsse
Michi
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 09:12
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
TRON

Registriert seit: 12. Sep 2003
4 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 09:28
Wichtig ist dass die Zugriffe im Execute-Event thread-sicher programmiert sind.
  Mit Zitat antworten Zitat
Trusti75

Registriert seit: 17. Dez 2006
7 Beiträge
 
#6

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 09:28
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.
Ja, dass da was falsch läuft, ist die Ursache meiner Anfrage.
Aber was passiert bei Dir, wenn Clients zeitgleich anfragen? Über AContext.Bindigs.Peerip stelle ich fest, wer gerade ne Anfrage stellt. Kommt ne neue rein der verwirft er die IP und fängt mit der neuen Ip von vorn an. Meine ganze Abarbeitung findet im Execute-Ereignis statt und kann auch dauern ein paar Sekunden, was vielleicht nicht richtig ist. Oder muss ich vielleicht einen eigenen Thread für jeden Vorgang separat erzeugen? Wie machst Du das mit den Anfragen bei Gleichzeitigkeit?
Grüsse
Michi
  Mit Zitat antworten Zitat
TRON

Registriert seit: 12. Sep 2003
4 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 09:39
Dann hast du was falsch gemacht.

Ich habe in D2010 eine TcpServer laufen wo bis zu 100 Client gleichzeitig ihre Anfragen abarbeiten.
Oder muss ich vielleicht einen eigenen Thread für jeden Vorgang separat erzeugen? Wie machst Du das mit den Anfragen bei Gleichzeitigkeit?
Grüsse
Der Indy TCPServer verwaltet die Threads automatisch. Wichtig ist nur eine thread-sichere Programmierung innerhalb des Execute-Events.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 09:49
Über AContext.Bindigs.Peerip stelle ich fest, wer gerade ne Anfrage stellt. Kommt ne neue rein der verwirft er die IP und fängt mit der neuen Ip von vorn an.
Jeder Client (genauer: jede Connection) bekommt einen separaten Context. Es ist also durchaus möglich, daß Execute mit verschiedenen Instanzen von AContext parallel (in separaten Threads) aufgerufen wird. Das heißt aber nicht, daß die Execute-Methoden nicht alle auch abgearbeitet werden.

Wie schon gesagt, muss man sich dieses Sachverhalts nur gewahr sein und Execute eben threadsicher programmieren.

Zur Kontrolle könntest du ja mal am Anfang und am Ende von Execute entsprechende Log-Meldungen ausgeben - mit einem threadsicheren Logger natürlich.

Oder die Poor-Programmer Lösung: InterlockedIncrement/Decrement auf eine globale (mit 0 initialisierte) Variable und am Ende schauen, ob die wieder 0 ist.
Uwe Raabe
  Mit Zitat antworten Zitat
Trusti75

Registriert seit: 17. Dez 2006
7 Beiträge
 
#9

AW: Tcp-Server bedient mehrere Clients; Organisation die Abarbeitung nicht gesichert

  Alt 27. Jul 2010, 10:14
Danke für die Hilfe!! "Threadsicher" war das Stichwort. Ich hab nochmal alles kontrolliert und da war noch ne Variable, die ich übersehen hatte und damit alles durcheinander kam. Der Fehler sitzt fast immer vor dem Monitor.
Michi
  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 03:18 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