Einzelnen Beitrag anzeigen

Puhbaehr
(Gast)

n/a Beiträge
 
#4

Re: Theorie: Client und Server in einem Programm/auf einem R

  Alt 17. Nov 2005, 07:39
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?
  Mit Zitat antworten Zitat