IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Comment tester la présence de machine ?


Sujet :

Web & réseau Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Comment tester la présence de machine ?
    Bonjour à tous

    J'ai créer une application qui vérifie une température dans une salle et qui arrete les machines de la salle si la temperature est trop élevée.
    Une socket serveur ecoute un port sur tous les PC à arrêter.

    Dans la partie que j'ai developpé, j'utilise une socket cliente pour envoyer un message au serveurs ce qui arrete le pc. (je sais pas si je suis tres clair)

    Mon probleme est que je doit vérifier que la machine est bien arrêtée et je n'ai pas d'idée. Je voudrai juste savoir si l'IP est accessible ou pas. Est-ce qu'il existe des methodes toute faites ou est-ce qu'une fonctionnalité de la socket peut me le dire???

    j'utilise delphi4
    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Fait un ping sur chaque adresse ip. Si tu n'as pas de réponses, c'est qu'il est éteint [ou que le réseau est par terre, mais là, de toute façon, tu e peux pas le savoir].
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    j'ai vu un sujet la dessus un peu plus bas mais je ne comprend absolument rien... Si qq'1 pouvait m'expliquer vite fait la demarche a suivre

    merci d'avance

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    est-ce qu'il est possible d'avoir un retour d'une commande DOS.
    J'execute deja un fichier BAT mais je sais pas si c'est possible d'avoir un retour de l'execution d'un fichier bat...
    Si quelqu'un l'a dja fait......

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 968
    Points
    6 968
    Par défaut
    Essais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 GetConsoleText(Command:String; var Result:String);
    const
         LENBUFF = 512; // Augmente le si tu as des problèmes
    var
       hReadPipe, hWritePipe: THandle;
       sa : TSecurityAttributes;
       si : TStartupInfo;
       pi : TProcessInformation;
       lpBuffer    : array[0..LENBUFF] of char;
       BytesRead   : Cardinal;
       BytesToRead : integer;
    begin
         sa.nLength              := sizeof( sa );
         sa.lpSecurityDescriptor := nil;
         sa.bInheritHandle       := True;
     
         if not CreatePipe( hReadPipe, hWritePipe, @sa, 0 ) then begin
            Application.MessageBox( pChar('Error creation Pipe' ), 'Error',IDOK );
            exit;
         end;
     
         FillChar( si, sizeof(si), 0 );
         si.cb          := sizeof( si );
         si.dwFlags     := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
         si.wShowWindow := SW_HIDE;
         si.hStdInput   := 0;
         si.hStdOutput  := hWritePipe;
         si.hStdError   := hWritePipe;
     
         if not CreateProcess( nil, pChar( Command ), nil, nil, true, 0, nil, nil, si, pi ) then begin
            Application.MessageBox( pChar('Error executing command' ), 'Error', IDOK );
            CloseHandle( hReadPipe );
            CloseHandle( hWritePipe );
            exit;
         end;
     
         CloseHandle( hWritePipe );
         BytesToRead := LENBUFF;
         BytesRead := 0;
     
        Result := '';
         While (True) do begin
               lpBuffer := '';
               ReadFile( hReadPipe, lpBuffer, BytesToRead, BytesRead, nil );
               if BytesRead=0 then Break;
               Result := Result + StrPas(lpBuffer);
         end;
     
         WaitForSingleObject( pi.hProcess, INFINITE );
         CloseHandle( pi.hProcess );
         CloseHandle( hReadPipe );
    end;
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut

    +1
    De toutes les choses que j'ai perdue,
    Celle qui me manque le plus...
    c'est mon esprit !

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    merci pour ta methode, meme je ne la comprend pas du tout...
    mais apres, comment est-ce que je peux analyser le retour?
    car il me sort:

    Envoi d'une requete de ping sur ....:
    reponse de 192.168.15.248: octet=30 temps<10ms TTL=128
    avec 10 lignes de reponse.

    Est-ce que je peux lui dire que si le texte contient "perdus=0" ou "reponse de" alors c'est bon???

    DSL si je suis vraiment trop nul en delphi mais je debute et j'ai vraiment besoin de vos conseils...

    merci

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 968
    Points
    6 968
    Par défaut
    Moi, je recherchais l'expression "OK " dans la chaine résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if Pos('OK ', szResult) > 0 then
       // C'est OK
    else
       // C'est pas ok
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    ok ca marche nikel
    merci beaucoup

  10. #10
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    Ben en fait... ce message, du coup, est pour Lung et pour toi (J'ai réécrit la source en utilisant les bonnes idées de Lung ). Je n'avais pas vue que Lung utilisait une procedure en fait :'(.

    Tu devras déclarer une constante SPipe qui contiendras la taille du Buffer.
    Voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Function RunSpyStdOut(Const Commande:String; Var Out:String): Integer;
    Var
       Start   : TStartupInfo       ;
       Process : TProcessInformation;
       Sa      : TSecurityAttributes;
       PipeOut,
       PipeIn ,
       Readed  : Cardinal;
       Buffer  : String  ;
       WhatApen: DWord;
     
    begin
      RunSpyStdOut := -1;
      // Choix de la taille du Buffer...
      SetLength(Buffer, SPipe);
     
      // Initialisation des attributs de sécurité
      FillChar (Sa, SizeOf(Sa), #0);
      Sa.nLength              := SizeOf (Sa);
      Sa.bInheritHandle       := TRUE;
     
      // Création du Pipe
      if not CreatePipe(PipeIn, PipeOut, @Sa, SPipe) then
         Exit;
     
      // Paramétrage du lancemant de l'application
      FillChar(Start,SizeOf(Start),#0);
      Start.cb          := SizeOf(Start);
      Start.dwFlags     := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
      Start.hStdOutput  := PipeOut;
      Start.wShowWindow := SW_HIDE;
     
      // Création du Processus pour l'application
      If not CreateProcess(Nil,
                           PChar(Commande),
                           Nil, Nil,
                           True,
                           0, Nil, Nil,
                           Start,Process) Then Begin
                             CloseHandle(Pipein);
                             CloseHandle(PipeOut);
                             Exit;
                           End;
      // OK...
      // On peut, et on doit, fermer le handle d'écriture du pipe.
      // 1 - Parceque de toute façon on ne va rien écrire dedans.
      // 2 - Parceque si non la fontion ReadFile risque de rester bloquer car un
      //     Handle est toujours ouvert à la fermeture de l'pplication dont on
      //     récupaire la sortie standard.
      CloseHandle (PipeOut);
     
      Repeat
        //   Quoi qu'il se passe, on va lire le flux du pipe car, s'il est plein,
        // la fonction d'écriture de la console dans le pipe ne rend pas la main
        // au programme apellant.
        // Si le pipe est plein, le programme ne reprend jamais la main !!!
        ReadFile(PipeIn, Buffer[1], SPipe, Readed, nil);
        Out:=Out+copy(Buffer,1,Readed);
     
        // ...on va patienté quelque miliseconde.
     
        WhatApen := WaitForSingleObject(Process.hProcess, 125);
        Application.ProcessMessages;
      until WhatApen = WAIT_OBJECT_0;
     
      GetExitCodeProcess(Process.hProcess, WhatApen);
      CloseHandle(PipeIn);
      CloseHandle(Process.hProcess);
      RunSpyStdOut:=WhatApen;
    End;
    Et il suffit de verifier si la valeur de retour est 0 ou 1...
    De toutes les choses que j'ai perdue,
    Celle qui me manque le plus...
    c'est mon esprit !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment tester la présence d'un fichier plat?
    Par magmerlin dans le forum z/OS
    Réponses: 7
    Dernier message: 11/08/2011, 09h43
  2. [XL-2003] comment tester la présence d'un caractère dans une cellule
    Par fllyann dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 28/12/2010, 21h05
  3. [Déploiement] Comment tester la présence du Framework .Net ?
    Par adrienfehr dans le forum Framework .NET
    Réponses: 5
    Dernier message: 19/08/2008, 08h34
  4. Réponses: 2
    Dernier message: 03/07/2008, 12h38
  5. Comment tester la présence d'une valeur dans une liste?
    Par jeo13 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/06/2008, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo