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 connaître le type d'un élément dans un réseau IP ?


Sujet :

Web & réseau Delphi

  1. #1
    Membre régulier Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Points : 94
    Points
    94
    Par défaut Comment connaître le type d'un élément dans un réseau IP ?
    je developpe un petit outil qui permet de faire l'inventaire d'un réseau local, et j'aimerais pouvoir connaitre le type d'un élément réseau que je ping.

    Par exemple savoir si derriere telle adresse ip il y a une imprimante ou un pc ou un mac ...

    - je fais une ouverture WMI sur le host que je ping juste pour savoir si c'est un pc mais cela prend trop de tremps.

    exisite t'il donc un protocole ou une astuce qui permet de connaitre la nature d'un élément réseau?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 549
    Points : 25 119
    Points
    25 119
    Par défaut
    le Ping c'est du ICMP, moi je fais ceci (on doit le trouver sur le forum normal, mais comme je le retrouve pas je met le code), pourrais tu me passer le tient par curiosité !

    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    // -----------------------------------------------------------------------------
    class function TConfigController.Ping(const IP: string): Boolean;
    type
      TECHO_REPLY_MSG = record
        Status: ULONG;
        Message: string;
      end;
    const
      MSG: array[1..27] of TECHO_REPLY_MSG = (
        (Status: 0; Message: 'The status was success.'),
        (Status: 1; Message: 'The reply buffer was too small.'),
        (Status: 2; Message: 'The destination network was unreachable. In IPv6 terminology, this status value is also defined as IP_DEST_NO_ROUTE.'),
        (Status: 3; Message: 'The destination host was unreachable. In IPv6 terminology, this status value is also defined as IP_DEST_ADDR_UNREACHABLE.'),
        (Status: 4; Message: 'The destination protocol was unreachable. In IPv6 terminology, this status value is also defined as IP_DEST_PROHIBITED.'),
        (Status: 5; Message: 'The destination port was unreachable.'),
        (Status: 6; Message: 'No IP resources were available.'),
        (Status: 7; Message: 'A bad IP option was specified.'),
        (Status: 8; Message: 'A hardware error occurred.'),
        (Status: 9; Message: 'The packet was too big.'),
        (Status: 10; Message: 'The request timed out.'),
        (Status: 11; Message: 'A bad request.'),
        (Status: 12; Message: 'A bad route.'),
        (Status: 13; Message: 'The Time to Live (IPv4) or Hop Limit (IPv6) expired in transit. In IPv6 terminology, this status value is also defined as IP_HOP_LIMIT_EXCEEDED.'),
        (Status: 14; Message: 'The Time to Live (IPv4) or Hop Limit (IPv6) expired during fragment reassembly. In IPv6 terminology, this status value is also defined as IP_REASSEMBLY_TIME_EXCEEDED.'),
        (Status: 15; Message: 'A parameter problem. In IPv6 terminology, this status value is also defined as IP_PARAMETER_PROBLEM.'),
        (Status: 16; Message: ' Message: ''Datagrams are arriving too fast to be processed and datagrams may have been discarded.'),
        (Status: 17; Message: 'An IP option was too big.'),
        (Status: 18; Message: 'A bad destination.'),
        (Status: 40; Message: 'The destination was unreachable. The value is only applicable to IPv6.'),
        (Status: 41; Message: 'The time was exceeded. The value is only applicable to IPv6.'),
        (Status: 42; Message: 'A bad IP header was encountered. The value is only applicable to IPv6.'),
        (Status: 43; Message: 'An unrecognized next header was encountered. The value is only applicable to IPv6.'),
        (Status: 44; Message: 'An ICMP error occurred. The value is only applicable to IPv6.'),
        (Status: 45; Message: 'A destination scope ID mismatch occurred. The value is only applicable to IPv6.'),
        (Status: 50; Message: 'General Failure.'),
        (Status: 255; Message: 'IP Pending.')
      );
     
      function GetStatus(Status: ULONG): string;
      var
        iMsg: Integer;
      begin
        Result := SysErrorMessage(Status);
        if Status >= 11000 then
          Status := Status - 11000;
     
        for iMsg := Low(MSG) to High(MSG) do
        begin
          if MSG[iMsg].Status = Status then
          begin
            Result := MSG[iMsg].Message;
            Exit;
          end;
        end;
      end;
     
    type
      PIP_OPTION_INFORMATION = ^TIP_OPTION_INFORMATION;
      TIP_OPTION_INFORMATION = record
        Ttl: UCHAR;
        Tos: UCHAR;
        Flags: UCHAR;
        OptionsSize: UCHAR;
        OptionsData: PUCHAR;
      end;
      PICMP_ECHO_REPLY = ^TICMP_ECHO_REPLY;
      TICMP_ECHO_REPLY = record
        Address: TInAddr;
        Status: ULONG;
        RoundTripTime: ULONG;
        DataSize: Word;
        Reserved: Word;
        Data: Pointer;
        Options: TIP_OPTION_INFORMATION;
      end;
     
    var
      IphlpapiHandle: THandle;
      _IcmpCreateFile: function(): THandle; stdcall;
      _IcmpCloseHandle: function(IcmpHandle: THandle): BOOL; stdcall;
      _IcmpSendEcho: function(IcmpHandle: THandle; DestinationAddress: TInAddr; RequestData: Pointer; RequestSize: WORD; RequestOptions: PIP_OPTION_INFORMATION; ReplyBuffer: Pointer; ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall;
    var
      InAddr: TInAddr;
      IcmpHandle: THandle;
      SendData: PChar;
      dwRetVal: DWORD;
      Reply: PICMP_ECHO_REPLY;
      TimeStr: string;
    begin
      try
        IphlpapiHandle := LoadLibrary('Iphlpapi');
        Result := IphlpapiHandle > 0;
        if Result then
        begin
          try
            @_IcmpCreateFile := GetProcAddress(IphlpapiHandle, 'IcmpCreateFile');
            @_IcmpCloseHandle := GetProcAddress(IphlpapiHandle, 'IcmpCloseHandle');
            @_IcmpSendEcho := GetProcAddress(IphlpapiHandle, 'IcmpSendEcho');
            Result := Assigned(@_IcmpCreateFile) and Assigned(@_IcmpCloseHandle) and Assigned(@_IcmpSendEcho);
            if Result then
            begin
              SendData := 'Shai - Test de la Connexion (Ping) par un Send Echo (ICMP) !';
              InAddr.S_addr := inet_addr(PChar(IP));
              IcmpHandle := _IcmpCreateFile();
              try
                GetMem(Reply, StrLen(SendData) + SizeOf(TICMP_ECHO_REPLY)); 
                try
                  dwRetVal := _IcmpSendEcho(IcmpHandle, InAddr, SendData, StrLen(SendData), nil, Reply, StrLen(SendData) + SizeOf(TICMP_ECHO_REPLY), 1000);
                  Result := dwRetVal <> 0;
                  if Result then
                  begin
                    if Reply^.RoundTripTime <= 0 then
                      TimeStr := ' < 1ms'
                    else
                      TimeStr := Format(' = %dms', [Reply^.RoundTripTime]);
                    _CCReport.AddInfo('IP', Format('Ping sur %s, Status : "%s", Temps%s, Message Reçu %d/1, TTL = %d', [IP, GetStatus(Reply^.Status), TimeStr, dwRetVal, Reply^.Options.Ttl]));
                  end else
                  begin
                    _CCReport.AddError('IP', Format('Echec du Ping sur %s, Erreur %d : %s', [IP, Windows.GetLastError(), GetStatus(Windows.GetLastError())]));
                  end;
                finally
                  FreeMem(Reply);
                end;
              finally
                _IcmpCloseHandle(IcmpHandle);
              end;
            end else
              _CCReport.AddError('IP', 'Impossible d''Obtenir les Procédures "IcmpCreateFile", "IcmpCloseHandle" et "IcmpSendEcho"');
          finally
            FreeLibrary(IphlpapiHandle);
          end;
        end else
           _CCReport.AddError('IP', 'Impossible de Charger "Iphlpapi.dll"');
      except
        on E: Exception do
        begin
          _CCReport.AddError('IP', E.Message);
          Result := False;
        end;
      end;
    end;
    Maintenant, tu veux en fait connaitre l'OS de la machine (Windows, Mac, Linux, MachinTrucEpsonSystem, BiduleChoseCanonOS ...), hum, après, ce genre de chose est connu par le browser (entête http fourni plein d'info comme le browser et l'os), genre ce que te donnera "http://www.ip-adress.com/",
    Sinon tu as le logiciel "NMap" qui le fait ... va savoir comment ils font, je sais que win, linux et mac ont chacun une "gueule" de trame IP, mais un routeur va neutralisé ces différences typiques ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    d'abord merci beaucoup pour ton aide est pardon mille fois pour ce retard...

    En fait je n'ai pas vraiment de procédures particulièrements interessantes a part tester la connection avec WMI ce qui me permet de savoir que je ne suis pas sur une imprimante, un mac, un boitier réseau, une sun, un aix etc...

    mais pour savoir si je suis sur un de ceux la , ca devient beaccoup plus
    difficile, et je crois que avec ICMP ca ne donne pas d'infos interessante pour a sujet.

    enfin ton idée d'interroger le browser pour le type d'os me parrait effectivement astucieuse! peut etre en faisant une requete HTTP sur le port web d'une sun par exemple j'obtiendrais l'OS de celle ci ... enfin vers un client je ne sais pas...?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 310
    Points : 184
    Points
    184
    Par défaut
    Tu peux utiliser aussi le protocole SNMP, si les périphériques le prenne en charge bien sur, en interrogeant un des registre de la mib tu peux avoir un identifiant unique par type de matériel, je l'utilisais dans un soft, je lance un appel sur un registre particulier de la mib (mib::sysOobjectID) sur l'adresse de broadcast, et toutes les périphériques compatibles me répondent par leur identifiant. Du coup je n'es plus qu'a inspecter ma base d'identifiant pour savoir exactement qui j'ai a faire.

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    j'ai un outils qui teste les adresses IP de notre réseau pour déterminer les équipements allumés de nuit, je commence par un ping, puis un reverse DNS pour voir si c'est une adresse connue de notre DNS interne (un serveur dans notre cas), puis je tente une connexion SNMP qui va fonctionner sur les routeurs switch et autres équipements réseaux, finalement je fais une connexion HTTP pour identifier les imprimantes HP.

    ce qui reste c'est en général des PC Windows, et comme nous n'utilisons pas le réseau Microsoft, je consulte également une base de données MySQL pour voir si l'adresse y est déclarée (inventaire matériel).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 310
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    j'ai un outils qui teste les adresses IP de notre réseau pour déterminer les équipements allumés de nuit, je commence par un ping, puis un reverse DNS pour voir si c'est une adresse connue de notre DNS interne (un serveur dans notre cas), puis je tente une connexion SNMP qui va fonctionner sur les routeurs switch et autres équipements réseaux, finalement je fais une connexion HTTP pour identifier les imprimantes HP.

    ce qui reste c'est en général des PC Windows, et comme nous n'utilisons pas le réseau Microsoft, je consulte également une base de données MySQL pour voir si l'adresse y est déclarée (inventaire matériel).
    il existe dans windows un agent snmp. Il suiffit d'installer et démarrer le service pour pouvoir l'utiliser, il te permettra d'identifier les pc sous windows

Discussions similaires

  1. Comment connaître le type d'évènement déclencheur du trigger
    Par vincent.delhommois dans le forum PL/SQL
    Réponses: 4
    Dernier message: 18/09/2006, 15h10
  2. Réponses: 6
    Dernier message: 27/06/2006, 23h26
  3. Réponses: 4
    Dernier message: 01/05/2006, 23h02
  4. Comment connaitre le type d'un attribut dans une table?
    Par Abdou_9002 dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/03/2006, 10h07
  5. [POO] Comment connaître le type d'un objet
    Par zizou39 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/03/2005, 09h46

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