Entwickler-Ecke

Internet / Netzwerk - mittels TClientSocket überprüfen, ob Port 8090 belegt ist


p_h_i_l - Di 20.11.07 19:02
Titel: mittels TClientSocket überprüfen, ob Port 8090 belegt ist
Hallo Zusammen,
habe nun angefangen mit einer TClientSocket. Bin absoluter Anfänger und kenn mich nicht aus, aber muss/soll/darf was für meinen Chef programmieren :-)
Wenn ich den applikation Server starte (dauert 15-35 sek), soll immer wieder durch eine schleife geprüft werden ob port "8090"(auf dem läuft der Server) belegt ist. Wenn belegt, dann ist applikationServer gestartet.
Nun wenn der port belegt ist soll ein BatchFiles aufgerufen werden. Dieses Batchfile hat etwas mit dem Server zu tun und darf nur gestartet werden wenn der ApplikationServer "Jboss" gestartet ist! darum will ich den Port abprüfen.

hab gelesen das geht mit so einer Schnittstelle TClientSocket.

bisher habe ich es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
//Prüfen ob JBOSS gestartet ist
serverstarted := false;

ClientSocket1.Host := 'localhost';
ClientSocket1.Port := 8090;
ClientSocket1.Open;


while serverstarted = false do begin

try
ClientSocket1.Active := True;


serverstarted := true;
except

sleep(1000);
end;

if serverstarted = true then begin
SetCurrentDir(dir);
ShellExecute(Handle, 'open', tmpPcharBrowser, nilnil, SW_SHOWNORMAL);
Application.Terminate;

end;

in meiner Schleife soll er immer wieder in die Exception laufen wenn ClientSocket1.active nicht true ist. wenn True dann die Variable serverstarted auf true setzen und in der darauf folgenden if-Bedingung das Batch.File ausführen.
Doch irgendwie läuft er immer über dieses Statement und springt nicht in die Exception. mache ich etwas falsch.? funktioniert dieses ClientSocket1.aktive := True nicht? muss ich etwas anderes versuchen?
oder fehlt mir grundsätzlich etwas....
Mache ich hier etwas grundlegendes falsch?

Gruß.und THX im Voraus
Philipp

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Narses - Di 20.11.07 19:17
Titel: Re: mittels TClientSocket überprüfen, ob Port 8090 belegt ist
Moin und :welcome: im Forum!

user profile iconp_h_i_l hat folgendes geschrieben:
Doch irgendwie läuft er immer über dieses Statement und springt nicht in die Exception. mache ich etwas falsch.? funktioniert dieses ClientSocket1.aktive := True nicht? [...] Mache ich hier etwas grundlegendes falsch?
Ja, du verwendest einen non-blocking-socket nicht wie vorgesehen ereignisorientiert. ;) Deine Vorgehensweise klappt nur mit blocking-socket-calls. (wobei man über den Code noch diskutieren könnte... :?)

user profile iconp_h_i_l hat folgendes geschrieben:
muss ich etwas anderes versuchen?
Da du einen Port auf der lokalen Maschine prüfen willst, würde ich einfach netstat -a z.B. hiermit [http://www.delphi-library.de/viewtopic.php?p=385387#385387] ausführen und schauen, ob der Port in der Liste auftaucht, sicherheitshalber noch ein paar Sekunden warten und dann deine Batchdatei ausführen. :idea:

cu
Narses


p_h_i_l - Mi 21.11.07 10:17

Moin,
das man über den code diskutieren würde weiß ich :-)
ich muss es so ausdrücken, ich frickle hier einfach aus code Beispielen mir immer was zusammen und hoffe das es funktioniert :-)

aber solang es funktioniert ist mir egal wie der code aussieht :-)

naja bin sehr überrascht über die schnelle Antwort danke!
wie sieht den das ganze ereignisorientiert aus? habe ich ein falsches socket genutzt oder ist nur dieser ClientSocket.active := true falsch? versteh nämlich nur Bahnhof *G*


ah ja und die zweite Variante gefällt mir ned so wie die erste, würde gern bei der ersten bleiben... kannst mir noch kurz helfen wie ich das umsetzen soll? also was genau der fehler ist?


Narses - Mi 21.11.07 13:42

Moin!

user profile iconp_h_i_l hat folgendes geschrieben:
ich muss es so ausdrücken, ich frickle hier einfach aus code Beispielen mir immer was zusammen und hoffe das es funktioniert :-)
aber solang es funktioniert ist mir egal wie der code aussieht :-)
:|

user profile iconp_h_i_l hat folgendes geschrieben:
wie sieht den das ganze ereignisorientiert aus?
Das ist hier einfach der falsche Ansatz, egal wie es aussieht. :nixweiss:

user profile iconp_h_i_l hat folgendes geschrieben:
ah ja und die zweite Variante gefällt mir ned so wie die erste, würde gern bei der ersten bleiben... kannst mir noch kurz helfen wie ich das umsetzen soll?
Nein. :? Probier´s mal so, wie hier vorgeschlagen [http://www.delphi-forum.de/viewtopic.php?t=28334], der Code ist zwar etwas merkwürdig hingeklatscht, sollte aber das gewünschte Resultat liefern. :idea:

cu
Narses


p_h_i_l - Do 22.11.07 09:54

so, habe den code jetzt so gelassen wie er war.
es gibt da eine Einstellung beim TClientSocket auf der man umswitchen kann von Standardmässig non-blocking auf blocking.
jetzt funktionierts....

Gruß,
Phil


Narses - Do 22.11.07 14:16

Moin!

user profile iconp_h_i_l hat folgendes geschrieben:
so, habe den code jetzt so gelassen wie er war.
es gibt da eine Einstellung beim TClientSocket auf der man umswitchen kann von Standardmässig non-blocking auf blocking.
jetzt funktionierts....
Es stürtzt nur nicht sofort ab, mehr wird man kaum sagen können... ;)

Ich rate trotzdem davon ab, den Code aus dem ersten Beitrag zu verwenden, er ist fehlerhaft.

cu
Narses