Entwickler-Ecke

Internet / Netzwerk - Clientsocket soll ständig versuchen, zu verbinden


Marco D. - Fr 04.11.05 17:39
Titel: Clientsocket soll ständig versuchen, zu verbinden
Also mein Programm baut auf einer Client-Server-Verbindung auf. Wenn aber der Clientsocket zuerst aktiviert ist und dann der Serversocket, dann wird keine Verbindung aufgebaut. Andersrum gehts natürlich. Nun dachte ich mir, bau ich eine Prozedur, bei der der Clientsocket ständig versucht, seinen Server zu finden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TryToConnect(clientsocket : Tclientsocket; StartTrying : boolean);
begin
if StartTrying=true then
begin
  //so lange versuchen eine Verbindung aufzubauen, bis sie steht
  repeat
  clientsocket.Open;
  clientsocket.close;
  until clientsocket.Socket.Connected=true; //also ich glaub das liegt hieran
                                            //ich will nur abfragen, ob eine Verbindung steht oder nicht
end
else begin
  //wenn der Verbindungsversuch abgebrochen werden soll
  clientsocket.Close;
end;
end;


Also das klappt nicht, ich glaube auch zu wissen wo, die mögliche Fehlerquelle habe ich im Quelltext kenntlich gemacht.
Hoffe auf Lösungen :flehan:


retnyg - Fr 04.11.05 17:43


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin   
  //so lange versuchen eine Verbindung aufzubauen, bis sie steht   
  while true do begin
    clientsocket.Open;   
    if clientsocket.Socket.Connected then break;
  end;
end


Marco D. - Fr 04.11.05 18:11

Also das funzt irgendwie nicht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TryToConnect(clientsocket : Tclientsocket; StartTrying : boolean);
begin
if StartTrying=true then
begin
  //so lange versuchen eine Verbindung aufzubauen, bis sie steht
  while true do begin
  sleep(200);
    clientsocket.Open;
    if clientsocket.Socket.Connected then break;
  end;
end
else begin
  //wenn der Verbindungsversuch abgebrochen werden soll
  clientsocket.Close;
end;
end;


Der verbinder sich noch nicht mal so.

würde nicht auch folgendes gehen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ClientSocket2Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
    if errorcode<>0 then begin
                errorcode:=0;
                clientsocket2.Active:=false;
                application.ProcessMessages;
                sleep(2000);
                clientsocket2.Active:=true;
        end;
end;


Oder hat einer von euch ne ganz andere methode? ohne gehts bloß nicht,,,


retnyg - Fr 04.11.05 18:28

dann halt

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin   
  //so lange versuchen eine Verbindung aufzubauen, bis sie steht   
  while true do begin
    clientsocket.Open;   
    if clientsocket.Socket.Connected then break;
    clientsocket.Close;
  end;
end


Narses - So 06.11.05 02:00

Moin!

Zunächstmal halte ich das Vorhaben für kompletten Unfug; aber da es ja üblicherweise keinen Sinn macht, darauf hinzuweisen :roll:, hier ein Lösungsvorschlag:

Nach einem ClientSocket1.Open darf die nächste Reaktion erst entweder im .OnConnect oder im .OnError erfolgen, direkt in einer Schleife am Clientsocket rumzufummeln, kann nicht gehen. Die WSA brauchst erstmal einen Moment, bis die TCP-Socketanfrage einen Fehler resp. einen Connect meldet (das ganze läuft ja idR asynchron!).

cu
Narses