Autor Beitrag
wham1010
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP Prof.
D6 Pers
BeitragVerfasst: Di 26.12.06 19:30 
Hallo!!

Folgendes Problem hab ich:

Hab das folgende Programm auf 2 vernetzten PC´s laufen (natürlich auf dem 2. PC mit vertauschen Client/Server-Portnummern). Das erste Problem besteht darin, das der eine PC ungefähr 20 sekunden braucht, bevor er die Error-Routine durchläuft (warum nicht sofort???). Die zweite Unverständlichkeit, die sich ergibt, ist, das, wenn ich bei PC "A" das Programm zuerst starte und danach PC "B", Imageonline NIE auf True gesetzt wird - im umgekehrten Fall aber schon (aber auch erst nach den 20 Sekunden Wartezeit, nachdem die Error-Routine durchlaufen wurde. Firewalls wurden allesamt deaktiviert.
ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1.Host := '192.168.1.3';
  ClientSocket1.Port := 10000;
  ClientSocket1.Active := True;
  ServerSocket1.Port := 10001;
  ServerSocket1.Active := False;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Imageonline.Visible := True;
  Imageoffline.Visible := False;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Imageonline.Visible := False;
  Imageoffline.Visible := True;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Imageonline.Visible := True;
  Imageoffline.Visible := False;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Imageonline.Visible := False;
  Imageoffline.Visible := True;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  windows.Beep(1000,1000);
  ClientSocket1.Active := False;
  ServerSocket1.Active := True;
  ErrorCode := 0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ClientSocket1.Active := False;
  ServerSocket1.Active := False;
end;


Vielen Dank im Voraus
Raffo
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 300



BeitragVerfasst: Di 26.12.06 20:32 
Dein Code scheint OK, komischerweise habe ich auf meinem Netzwerk ebenfalls das 20SekProblem - aber unter DOS copy. Ansonsten finden sich die Computer sofort (hab aber leider Deinen Code nicht, vielleicht 2 Exe Server.exe / Client.exe posten).

Ich hab auf der 2. Partition ein neues "unberührtes Windows" - wo es ohne Probleme klappt; scheint so, das Dein Windows auch "versaubeutelt" ist. Mein Tipp, auf einer 2. Partition (wenn hoffentlich vorhanden) ein frisches Windows installieren, damit man solcher Art Netzwerkprobleme sicher ausschliessen kann.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 27.12.06 01:18 
Moin und :welcome: im Forum!

user profile iconwham1010 hat folgendes geschrieben:
Hab das folgende Programm auf 2 vernetzten PC´s laufen (natürlich auf dem 2. PC mit vertauschen Client/Server-Portnummern).

Hm, mir scheint, du hast da was bei den Sockets nicht verstanden. ;) Eine Socket-Verbindung ist vollduplex, du kannst mit einer aktiven Verbindung von einem Client zum Server Daten senden und empfangen, dazu brauchst du nicht in jeder Anwendung einen Client- und einen Server-Socket! :idea: (was nebenbei gesagt eh selten sinnvoll ist, Clients in Servern zu integrieren, aber das ist ein anderes Problem... ;)) Insofern ist dein (dir von mir unterstelltes) Konzept, einen Auto-Server zu bauen, der quasi "bei Bedarf oder wer zuerst startet", nicht im Sinne des Erfinders (bzw. der Socket-Erfinder). Das klappt nämlich nur unter Verwendung von aufeinander abgestimmten Portnummern (immer so viele, wieviele Programminstanzen gleichzeitig erwartet werden - und woher weißt du das immer so genau?; ist überhaupt ein ziemlich hakeliges Synchronisationsproblem).

Deshalb mein Rat: Verwende eine Serveranwendung und dazu passende Clients mit definierten Portnummern, das wird so nix. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
wham1010 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP Prof.
D6 Pers
BeitragVerfasst: Di 02.01.07 01:26 
Vielen Dank für die Antworten - werde wohl das Windows neu aufsetzen müssen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 02.01.07 01:48 
Moin!

user profile iconwham1010 hat folgendes geschrieben:
Vielen Dank für die Antworten - werde wohl das Windows neu aufsetzen müssen!

Mal langsam... ;)
user profile iconwham1010 hat folgendes geschrieben:
Das erste Problem besteht darin, das der eine PC ungefähr 20 sekunden braucht, bevor er die Error-Routine durchläuft (warum nicht sofort???).

Es gibt da ja auch noch die TCP-Timeouts. Wenn ein Client versucht, einen Server zu erreichen, der nicht verfügbar ist, dann muss das nicht sofort eine Fehlermeldung der WSA nach sich ziehen, das kann auch schonmal etwas dauern (vor allem, wenn dabei z.B. eine DNS-Anfrage dazwischen liegt, etc.).
Es stellt sich also die Frage, ob das ein "Feature-by-Design" ist. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.