Bekomme ich denn irgendwie raus ob ein Dienst unter einem Port bereits läuft?
Was passiert z.B. wenn ich meinen Server zufällig unter dem Port eines bereits gestarteten Dienstes starte?
Oder gleiches andersherum: Was passiert mit dem Dienst der erst nach meinem Server gestartet wird und meinen Port benutzen will?
Zu zweitens: Ich probiere genau das seit Tagen aus. Oder anders gesagt, weil ich immer zu faul bin zweimal das Programm zu öffnen hab ich Server und Client gleichzeitig in meinem Programm gestartet. Allerdings, und das ist das seltsame, kann der Client zwar Daten an den Server senden, aber, der Server fängt erst mit der Auswertung an wenn der Client aus seinem Thread raus ist.
Konkret (vereinfacht):
Delphi-Quellcode:
procedure ....BtnClick (...);
var
Value : Byte;
begin
IdTCPClient.Connect; // Verbindet brav
...
Value := 1;
IdTCPClient.WriteBuffer (Value, SizeOf (Value)); // Sendet brav
IdTCPClient.ReadBuffer (Value); // Hängt sich in einem ReadTimeout auf
ShowMessage (inttostr (Value));
...
IdTCPClient.Disconnect;
end;
procedure ....IdServerExecute (...);
var
Value : Byte;
begin
AThread.Connection.ReadBuffer (Value); // Liest brav
if (Value = 1) then
begin
Value := 0;
AThread.Connection.WriteBuffer (Value, SizeOf (Value)); // Sendet brav
end;
end;
Wenn ich ein Log mitlaufen lasse das vor und nach einem Read- und WriteBuffer Statusmeldungen ausgibt wird folgendes ersichtlich:
Code:
17.11.2005 07:29:39:185 Sitzungsnummer: 000000: Client: Erstelle Server...
17.11.2005 07:29:39:185 Sitzungsnummer: 000000: Client: Starte Server...
17.11.2005 07:29:39:205 Sitzungsnummer: 000000: Client: Erstelle Client...
17.11.2005 07:29:39:205 Sitzungsnummer: 000000: Client: Verbinde Client...
17.11.2005 07:29:39:335 Sitzungsnummer: 000001: Client: Sende LoginCmd (1)...
17.11.2005 07:29:39:335 Sitzungsnummer: 000001: Client: Lese Server-Antwort (2)
17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Client: Fehler beim Lesen! Read Timeout
17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Client: Sende Client-Version (3)...
17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Server: Client sendet LoginCmd (1)...
17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Bestätige Login (2)...
17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Server-Antwort Gesendet (2)
17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Client sendet Client-Version (3)...
17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Client terminated
----------------------------------------------------------------------------------------------------------------
TT.MM.JJJJ HH:MM:SS:MS Teilnehmer^ ^Nachricht
Teilnehmer
Sobald Sitzungsnummer = 1 ist beginnt Execute zu arbeiten. Alles ok. Aber der Server antwortet nicht rechtzeitig.
Sobald ich aber das Programm zweimal starte, d.h. ein Programm = Client, andere Programm = Server funktioniert es.
Warum? Muss ich den Start des Clienten in einem Exrta-Thread behandeln?