Entwickler-Ecke
Internet / Netzwerk - Client / Server - Problem
wham1010 - Di 26.12.06 19:30
Titel: Client / Server - Problem
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.
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 - 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 - Mi 27.12.06 01:18
Moin und :welcome: im Forum!
wham1010 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
wham1010 - Di 02.01.07 01:26
Vielen Dank für die Antworten - werde wohl das Windows neu aufsetzen müssen!
Narses - Di 02.01.07 01:48
Moin!
wham1010 hat folgendes geschrieben: |
| Vielen Dank für die Antworten - werde wohl das Windows neu aufsetzen müssen! |
Mal langsam... ;)
wham1010 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!