Problème simple avec "TclientSocket" - Delphi 7

Metsys Messages postés 1 Statut Membre -  
berrayahkamel Messages postés 175 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, j'aimerais faire un petit client en mode console qui tente plusieurs fois de se connecter au serveur, mais qui une fois connecté -> stop les tentatives et reste connecté.

Sauf que voilà: moi mon code il créer de nouvelles connexions en boucle :/
Mon code: http://pastebin.com/5ZuR9DNX

Merci :3

1 réponse

  1. berrayahkamel Messages postés 175 Date d'inscription   Statut Membre Dernière intervention   64
     
    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;
    2