Problème simple avec "TclientSocket" - Delphi 7
Fermé
Metsys
Messages postés
1
Date d'inscription
vendredi 28 juin 2013
Statut
Membre
Dernière intervention
28 juin 2013
-
Modifié par Metsys le 28/06/2013 à 01:57
berrayahkamel Messages postés 174 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 6 avril 2020 - 30 juin 2013 à 21:30
berrayahkamel Messages postés 174 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 6 avril 2020 - 30 juin 2013 à 21:30
A voir également:
- Problème simple avec "TclientSocket" - Delphi 7
- Telecharger delphi 7 - Télécharger - Langages
- Iphone 14 simple - Guide
- Telecharger photofiltre 7 gratuit - Télécharger - Retouche d'image
- Movie maker windows 7 - Télécharger - Montage & Édition
- Télécharger windows 7 32 bits usb - Télécharger - Systèmes d'exploitation
1 réponse
berrayahkamel
Messages postés
174
Date d'inscription
mardi 31 juillet 2007
Statut
Membre
Dernière intervention
6 avril 2020
64
Modifié par berrayahkamel le 30/06/2013 à 21:30
Modifié par berrayahkamel le 30/06/2013 à 21:30
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;