A voir également:
- Problème simple avec "TclientSocket" - Delphi 7
- Delphi 7 - Télécharger - Langages
- Photofiltre 7 - Télécharger - Retouche d'image
- Clé windows 7 - Guide
- Iphone 14 simple - Guide
- Télécharger 7-zip - Télécharger - Compression & Décompression
1 réponse
donc ton programme est le suivant
begin
sock:= TclientSocket.Create(nil);
sock.Address := '127.0.0.1';
sock.port := 1337;
While Sock.Active=false do
begin
sock.Open;
Writeln(sock.Address+' # '+inttostr(sock.port));
sleep(2500)
end;
D'après mon expérience la propriété Active n'ai pas fiable .
Quand tu fait open il faut vérifier ce que la fonction open retourne surtout en mode Blocking sinon elle n'a pas de sens .
Je suppose que ut utilise le mode nonbloking
donc ce qui tu fait est faut car :
un sleep de 2.5 seconde pas suffisant meme en local car sur les OS actuels (win7 ou 8 ou vista ) il y a plein de controle que le systeme doit faire avant qu'il t'autorise à d'ouvrir une socket ajouter aussi les anti-virus et les firewall.
D'pares mes tests sous win7 et meme XPsp3 des fois une connexion soket en local demande jsuqu'à 30 secondes
ta boucle doit être comme suite :
timeOutMax= 30;
sock.open;
while(timeOut < timeOutMax and Sock.Active=false ) do
begin
sleep(100);
inc(timeOut);
end;
if( timeOut>= timeOutMax) then Echec de connexion ( à toi de voire ce que tu vexu faire exemple un simple goto debut mais il fait mettre sock.close )
else c'est ok
== Il faut etre sure que ton serveur fonctionne donc fait : telnet 127.0.0.1 1337 au moins vous devriez avoir un écran noir mais pas d'erreur
Je vous conseil par contre d'utiliser l'objet TTCPclient
voila moi comment je l'utilise pour vérifier une connexion SSH
function TFormMain.SSHtest: Boolean;
var
delais: Integer;
begin
exit;
TimerControle.Enabled := false;
TcpClientSSH.RemoteHost := IPServeur;
TcpClientSSH.RemotePort := '22';
// TcpClientSSH.BlockMode := bmBlocking;
TcpClientSSH.BlockMode := bmNonBlocking;
if (TcpClientSSH.Connected) then
begin
MemoDiag.Lines.Add(' Service ssh UP ');
// TimerErreur.Enabled := false;
SShStatus := true;
end
else
begin
TcpClientSSH.Connect;
// Attente une seconde
delais := 0;
while (not(TcpClientSSH.Connected) and (delais < 10)) do
begin
inc(delais);
Application.ProcessMessages;
sleep(100);
end;
if (TcpClientSSH.Connected) then
begin
MemoDiag.Lines.Add(' Service ssh UP ');
// TimerErreur.Enabled := false;
SShStatus := true;
end
else
begin
MemoDiag.Lines.Add(' Service ssh Down ');
// TimerErreur.Enabled := true;
SShStatus := false;
end;
end;
SSHtest := SShStatus;
TimerControle.Enabled := true;
end;
begin
sock:= TclientSocket.Create(nil);
sock.Address := '127.0.0.1';
sock.port := 1337;
While Sock.Active=false do
begin
sock.Open;
Writeln(sock.Address+' # '+inttostr(sock.port));
sleep(2500)
end;
D'après mon expérience la propriété Active n'ai pas fiable .
Quand tu fait open il faut vérifier ce que la fonction open retourne surtout en mode Blocking sinon elle n'a pas de sens .
Je suppose que ut utilise le mode nonbloking
donc ce qui tu fait est faut car :
un sleep de 2.5 seconde pas suffisant meme en local car sur les OS actuels (win7 ou 8 ou vista ) il y a plein de controle que le systeme doit faire avant qu'il t'autorise à d'ouvrir une socket ajouter aussi les anti-virus et les firewall.
D'pares mes tests sous win7 et meme XPsp3 des fois une connexion soket en local demande jsuqu'à 30 secondes
ta boucle doit être comme suite :
timeOutMax= 30;
sock.open;
while(timeOut < timeOutMax and Sock.Active=false ) do
begin
sleep(100);
inc(timeOut);
end;
if( timeOut>= timeOutMax) then Echec de connexion ( à toi de voire ce que tu vexu faire exemple un simple goto debut mais il fait mettre sock.close )
else c'est ok
== Il faut etre sure que ton serveur fonctionne donc fait : telnet 127.0.0.1 1337 au moins vous devriez avoir un écran noir mais pas d'erreur
Je vous conseil par contre d'utiliser l'objet TTCPclient
voila moi comment je l'utilise pour vérifier une connexion SSH
function TFormMain.SSHtest: Boolean;
var
delais: Integer;
begin
exit;
TimerControle.Enabled := false;
TcpClientSSH.RemoteHost := IPServeur;
TcpClientSSH.RemotePort := '22';
// TcpClientSSH.BlockMode := bmBlocking;
TcpClientSSH.BlockMode := bmNonBlocking;
if (TcpClientSSH.Connected) then
begin
MemoDiag.Lines.Add(' Service ssh UP ');
// TimerErreur.Enabled := false;
SShStatus := true;
end
else
begin
TcpClientSSH.Connect;
// Attente une seconde
delais := 0;
while (not(TcpClientSSH.Connected) and (delais < 10)) do
begin
inc(delais);
Application.ProcessMessages;
sleep(100);
end;
if (TcpClientSSH.Connected) then
begin
MemoDiag.Lines.Add(' Service ssh UP ');
// TimerErreur.Enabled := false;
SShStatus := true;
end
else
begin
MemoDiag.Lines.Add(' Service ssh Down ');
// TimerErreur.Enabled := true;
SShStatus := false;
end;
end;
SSHtest := SShStatus;
TimerControle.Enabled := true;
end;