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 :

Etat de la connexion réseau d'un PC


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 396
    Points : 300
    Points
    300
    Par défaut Etat de la connexion réseau d'un PC
    Bonjour, j'aurais besoin de connaître l'état de la connexion réseau du PC qui supporte mon application.
    Je suis sous DXE2 et W7 ou 8.x, et l'idéal serait de récupérer les infos correspondant à l'état de l'icône réseau qui apparaît dans la barre des tâches à gauche.
    J'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetSystemMetrics(SM_NETWORK) and $0001>0
    l'information est juste au démarrage, mais elle n'est pas remise à jour.
    Au niveau de l'icône on a l'information de raccordement à un réseau (celle dont j'ai absolument besoin) et celle de la connexion à Internet (qui pourrait servir un jour).
    Merci

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    cherche du coté de InternetGetConnectedState dans la dll Wininet
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    JYH
    JYH est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    j'ai la même problématique as tu trouvé une solution ?

    perso pour le moment je n'ai trouvé que ça :

    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
     
    function ExistOrdiReseau(Ordi:string) :boolean;
    var
      PRessource: PNetResource;
      HandleEnum:THandle;
    begin
      if not(Recherche) then
      begin
        Recherche:=True;
        Ordi:='\\'+Ordi;
        result:=true;
        PRessource := AllocMem(16384);// 16Ko
        PRessource.lpRemoteName:=LPTSTR(Ordi);
        if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, PRessource, HandleEnum) <> NO_ERROR then
           result:=false;
        WNetCloseEnum(HandleEnum);
        FreeMem(pRessource);
        Recherche:=False;
      end;
    end;
     
    // pour évaluer si mon serveur est en ligne
    if ExistOrdiReseau('Serveur') then
    Mon application est destinée à des portables de gens qui vont souvent en réunion, donc réseau et/ou wifi, et doit tester régulièrement un base SQL.
    Je serais preneur d'une solution qui n'attende pas un time-out.
    Merci de vos réponses.

    JYH

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 396
    Points : 300
    Points
    300
    Par défaut
    Bonjour,
    Non je n'ai encore rien trouvé de vraiment efficace.
    Je ne comprend pas que personne ne sache comment récupérer les infos qui animent cette icône et qui sont vraiment pertinentes.

    Merci

    BB

  5. #5
    JYH
    JYH est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    En ce moment je suis sur la piste de détecter l'IP de la machine avant de tester la ressource serveur.
    j'utilise un JvComputerInfoEx un compo de la jedi-vcl
    comme mon réseau est en 10.100.xx.xxx

    if Pos('10.100.',JvComputerInfoEx1.Identification.IPAddress)=1 then
    begin
    ... ici mon code pour voir si le serveur est OK

    L'adresse si pas de réseau ni de wifi donne 127.0.0.1 chez moi

    Déjà ça confirme avant qu'on est bien sur le bon réseau. J'ai encore des problèmes mais je creuse.

    un détail j'ai mis {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} en directive de compilation sensé forcer la machine à charger entièrement le programme en mémoire.

    j'ai essayé les composants Indy mais ça me fige tout quand il n'y a pas de connexion ... mes clients n'ont aucune sens de l'humour ça ne leur conviendrait pas.

    JYH

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 396
    Points : 300
    Points
    300
    Par défaut
    Je n'avais pas pensé à JvComputerInfoEx. Effectivement s'il n'y a pas de réseau il semble que l'on récupère une IP en 127.0.0.1.

    Je n'ai pas pu le vérifier complètement, mais c'est quasi certain.
    Donc si on a autre chose que 127.0.0.1 le réseau est actif et on peut vérifier si on est sur le bon réseau.
    Par contre je ne vois pas ce qu'apporte le fait de charger tout le programme en mémoire ?
    Perso, je préfère les composants ICS à Indy, il me semble qu'ils sont plus simples à utiliser.

  7. #7
    JYH
    JYH est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    mon appli se trouve sur le réseau et se lance au démarrage de Windows
    s'il sont chez eux l'appli ne se lance pas donc.

    a la boite par contre une fois lancer j'avais des erreurs $C00006 quand la machine passait en wifi
    http://stackoverflow.com/questions/1...ption-c0000006 j'ai suivi ce truc et ça a calmé le jeux
    bon je ne prétends pas avoir pigé mais suis pragmatique

  8. #8
    JYH
    JYH est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Bon j'ai un début qui fonctionne pas trop mal pour le réseau:

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        etat: TLabel;
        NomPC: TLabel;
        IP_PC: TLabel;
        delai: TLabel;
        infoPC: TJvComputerInfoEx;
        PngImageList1: TPngImageList;
        procedure MAJ_label();
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
     
    Var                                    // des tites variable globales :)
    IpOK:string='10.100.';                 // début d'IP correct réseau
    ServeurIstar:string='serveur';         // nom du serveur qui nous interesse
    MemoIp:string;                         // pour tester si on a changer d'ip
    WaitNewIp:integer=30;                  // temps en seconde avant de rejouer si l'ip change
    WaitPlay:integer=10;                   // délai pour actualiser
     
     
    function ExistOrdiReseau(Ordi:string) :boolean;
    var
      PRessource: PNetResource;
      HandleEnum:THandle;
    begin
      Ordi:='\\'+Ordi;
      result:=true;
      PRessource := AllocMem(16384);// 16Ko
      PRessource.lpRemoteName:=LPTSTR(Ordi);
      if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, PRessource, HandleEnum) <> NO_ERROR then
         result:=false;
      WNetCloseEnum(HandleEnum);
      FreeMem(pRessource);
    end;
     
    function TestReseau(IpStr:string):Boolean;
    begin
      Result:=(Pos(IpOK,IpStr)=1);
    end;
     
    procedure TForm1.MAJ_label();
    begin
      IP_PC.Caption:='IP: '+infoPC.Identification.IPAddress;
      NomPC.Caption:='PC: '+infoPC.Identification.LocalComputerName;
      delai.Caption:='délai: '+inttostr(round(timer1.Interval/1000))+' s';
    end;
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // pour être en priorité basse et pas stresser le PC
      SetPriorityClass(GetCurrentProcess,IDLE_PRIORITY_CLASS);
      // on mémorise l'ip au début
      MemoIp:=infoPC.Identification.IPAddress;
      // on actualise les infos des labels
      MAJ_label();
      // initialisation de la tempo
      Timer1.Interval:=WaitPlay*1000;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      // on bloque le timer pour pas qu'il se redéclanche
      Timer1.Enabled:=false;
      // on signale le début
      etat.caption:='je cherche';
      // pour que la modif soit visible
      Application.ProcessMessages;
     
      // on test si l'ip a changé depuis le dernier coup
      if (MemoIp<>infoPC.Identification.IPAddress) then
      begin
        // on mémorisee la nouvelle IP
        MemoIp:=infoPC.Identification.IPAddress;
        // on laisse respirer xx Secondes
        Timer1.Interval:=WaitNewIp*1000;
        // on signale qu'il y a eu changement
        etat.caption:='j''attends ça a changé';
      end else
      // si l'IP n'a pas changer
      begin
        // on remet la tempo à la bonne valeur
        Timer1.Interval:=WaitPlay*1000;
        // on test si c'est le bon réseau
        if TestReseau(infoPC.Identification.IPAddress) then
          // si bon réseau on cherche le serveur
          if ExistOrdiReseau(ServeurIstar) then etat.caption:='OK' else etat.caption:='KO'
        // pas le bon reseau
        else etat.caption:='pas sur le réseau';
      end;
      MAJ_label();
      // on relance le timer
      Timer1.Enabled:=True;
    end;
     
     
     
     
    end.
    ça vaut ce que ça vaut mais ça ne plante pas.

    il me faut maintenant câbler les SQL qui vont bien.
    petite question un serveur SQL va t'il accepter sans broncher des connexions à répétition ...

    je sens que je vais pas tarder de le savoir

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 396
    Points : 300
    Points
    300
    Par défaut
    Perso c'est la partie réseau dont j'ai besoin et éventuellement il faudra que je vérifie que l'Internet est accessible.
    Ta démarche me parait inintéressante, dès que je peux je test.
    Tu avais compris : intéressante

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Test cnx internet
    Bonjour,
    Peut être hors sujet mais bon ...
    J'ai retrouvé (avec un peu de mal !) un vieux prog qui teste la connexion internet et le type de connexion. Je ne cite pas la source puisque a l'époque je ne l'avais pas notée. J'ai recompilé sous XE et ça a l'air de marcher.
    Fichiers attachés Fichiers attachés

  11. #11
    JYH
    JYH est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    mon premier code fonctionnait bien mais avait un défaut pour la gestion de portable avec wifi et réseau
    le composant TJvComputerInfoEx ne donne que la première IP trouvée en cas de perte du wifi cela n'est pas détecté

    j'ai finalement j'ai trouvé mon bonheur avec IdStack de Indy (à rajouter dans les uses)
    l'exemple qui m'a inspiré : http://stackoverflow.com/questions/5...-all-local-ips

    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
    function GetChangIp(ComboIp : TComboBox):Boolean;
    var
    MemoNbrIps:integer;
    MemoIp1:string;
    begin
      TIdStack.IncUsage;
      MemoIp1:=ComboIp.Items[0];
      MemoNbrIps:=ComboIp.Items.Count;
      try
        ComboIp.Items.Clear;
        GStack.AddLocalAddressesToList(ComboIp.Items);
        ComboIp.Text:=ComboIp.Items[0];
      finally
        TIdStack.DecUsage;
      end;
      if (MemoIp1<>ComboIp.Items[0]) or (MemoNbrIps<>ComboIp.Items.Count) then Result:=True else Result:=False;
    end;
    il me suffit de tester

    "if GetChangIp(CBIps) then"

    pour savoir s'il y a eu du changement sur les cartes réseau CBIps est une combo invisible (je ne maitrise pas les stringlist )

Discussions similaires

  1. Perte de connexion réseau
    Par Gege70 dans le forum Administration
    Réponses: 3
    Dernier message: 06/05/2005, 11h09
  2. Problèmes de connexion réseau à MySQL
    Par digital prophecy dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/05/2005, 22h35
  3. Services Oracle ne démarre pas sans connexion réseau??
    Par dreamanoir dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2005, 01h44
  4. Connaître l'état d'une connexion réseau
    Par SteelBox dans le forum Windows
    Réponses: 8
    Dernier message: 29/07/2004, 13h30
  5. API MySQL - Connexion réseau
    Par klael dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/03/2004, 10h25

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