Page 1 sur 1

Trouver ip du pc + si ossible l'ip des autre pc en réseau ..

Publié : mar. 27/sept./2005 5:55
par Simon
Slt à tous

je voudrais savoir comment trouver sa propre ip et en plus celle des autres pc reliés pas le reseau ...

Merci :)

Publié : mar. 27/sept./2005 9:21
par lionel_om
Pour trouver tes IP (internet et local), ya des fonctions toutes faites.
Pour celles des autres pc, j'c pas.
Peut être lancer des pings ou d'autres cmd réseaux... :?

Publié : mar. 27/sept./2005 10:29
par Backup
dans la console DOS tu tappe : ipconfig
:D

Publié : mar. 27/sept./2005 18:29
par Simon
Je c Dobro ça merci ...

Mais lionel_om je veux bien utiliser les fonctions toutes faites mais j'y comprend rein entre : InitNetwork() , ExamineIPAddresse() ,NextIPAddress() , IPString(AdresseIP) .... :(

pourrais tu me donner une piste ... STP :D

Publié : mar. 27/sept./2005 22:00
par fweil
Simon,

Voici un morceau de code qui répondra peut-être.

En fait on peut facilement énumérer les IP locales avec les fonctions Purebasic, ce qui est repris ici pour l'exemple.

Mais dès qu'on veut connaître l'IP externe ou les IP des postes voisins, c'est plus laborieux.

J'ai donc utilisé ce dont je disposait déjà comme code, et j'ai ajouté un exemple d'utilisation de la fonction API NetServerEnum_(). Par contre je ne suis pas en condition de tester si cela fonctionne bien pour l'instant.

Merci de me dire ce que ça donne de ton côté.

Code : Tout sélectionner

;
; CheckIP
; Local IPs, external IP, and LAN servers and workstations scan giving names and local IPs.
; F.Weil 20050927
;
#NERR_SUCCESS = $0
#NERR_INVALIDCOMPUTER = 2351
#NERR_MOREDATA = $234

#SV_TYPE_WORKSTATION = $00000001 ; All LAN Manager workstations
#SV_TYPE_SERVER = $00000002 ; All LAN Manager servers
#SV_TYPE_SQLSERVER = $00000004 ; Any server running with Microsoft SQL Server
#SV_TYPE_DOMAIN_CTRL = $00000008 ; Primary domain controller
#SV_TYPE_DOMAIN_BAKCTRL = $00000010 ; Backup domain controller
#SV_TYPE_TIMESOURCE = $00000020 ; Server running the Timesource service
#SV_TYPE_AFP = $00000040 ; Apple File Protocol servers
#SV_TYPE_NOVELL = $00000080 ; Novell servers
#SV_TYPE_DOMAIN_MEMBER = $00000100 ; LAN Manager 2.x Domain Member
#SV_TYPE_PRINT = $00000200 ; Server sharing print queue
#SV_TYPE_DIALIN = $00000400 ; Server running dial-in service
#SV_TYPE_XENIX_SERVER = $00000800 ; Xenix server
#SV_TYPE_NT = $00001000 ; Windows NT (either Workstation or Server)
#SV_TYPE_WFW = $00002000 ; Server running Windows for Workgroups
#SV_TYPE_MFPN = $00004000 ; Microsoft file and print for Netware
#SV_TYPE_SERVER_NT = $00008000 ; Windows NT Non-DC server
#SV_TYPE_POTENTIAL_BROWSER = $00010000 ; Server that can run the Browser service
#SV_TYPE_BACKUP_BROWSER = $00020000 ; Server running a Browser service as backup
#SV_TYPE_MASTER_BROWSER = $00040000 ; Server running the master Browser service
#SV_TYPE_DOMAIN_MASTER = $00080000 ; Server running the domain master Browser
#SV_TYPE_WINDOWS = $00400000 ; Windows 95 or later
#SV_TYPE_LOCAL_LIST_ONLY = $40000000 ; Servers maintained by the browser. See the following Remarks section.
#SV_TYPE_DOMAIN_ENUM = $80000000 ; Primary Domain 
#SV_TYPE_ALL = $FFFFFFFF ; All servers

Structure SERVER_INFO_100
  sv100_platform_id.l
  sv100_name.l
EndStructure
  
NewList ServerList.s()

Procedure.s MyIP()
  URL.s = "http://www.whatismyip.com"
  FileName.s = "CheckIP.tmp"
  If URLDownloadToFile_(0, URL, FileName, 0, 0) = #S_OK
      If ReadFile(0, FileName)
          Repeat
            String.s = ReadString()
            If FindString(String, "<h1>", 1)
                iu = FindString(String, "<h1>", 1)
                String = Mid(String, iu + 4, Len(String) - iu - 4 + 1)
                iu = FindString(String, "</h1>", 1)
                String = Mid(String, 1, iu - 1)
                String1.s = ""
                For i = 1 To Len(String)
                  Cod.s = Mid(String, i, 1)
                  If (Cod => "0" And Cod <= "9") Or Cod = "."
                      String1 + Cod
                  EndIf
                Next
            EndIf
          Until Eof(0)
          CloseFile(0)
          DeleteFile(FileName)
      EndIf
      ProcedureReturn String1
    Else
      ProcedureReturn "Can't access to " + URL
  EndIf
EndProcedure

Procedure.l Ansi2Uni(ansi.s)
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,-1,0,0)
  Dim unicode.w(size)
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size)
  ProcedureReturn @unicode() 
EndProcedure

Procedure.s Uni2Ansi(*Unicode.l)
  size.l = WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, #Null, #Null, #Null, #Null)
  ansi.s=Space(size)
  WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, @ansi, size, #Null, #Null)
  ProcedureReturn ansi 
EndProcedure

Procedure.s GetIPbyName(ServerName.s)
  ServerName = ReplaceString(ServerName, "\", "")
  TheIPAddress.s
  pHostinfo = gethostbyname_(ServerName)
  If pHostinfo = 0
      TheIPAddress = "Unable to resolve domain name"
    Else
      CopyMemory (pHostinfo, hostinfo.HOSTENT, SizeOf(HOSTENT))
      If hostinfo\h_addr <> #AF_INET
          TheIPAddress = "A non-IP address was returned."
        Else
          While PeekL(hostinfo\h_list + AdressNumber * 4)
            ipAddress = PeekL(hostinfo\h_list + AdressNumber * 4)
            TheIPAddress + StrU(PeekB(ipAddress), 0) + "." + StrU(PeekB(ipAddress + 1), 0) + "." + StrU(PeekB(ipAddress + 2), 0) + "." + StrU(PeekB(ipAddress + 3), 0) + Chr(10) + Chr(13)
            AdressNumber + 1
          Wend
      EndIf
  EndIf
  ProcedureReturn TheIPAddress
EndProcedure

  
  If InitNetwork()
      ;
      ; Pour voir les IP locales en utilisant les fonctions Purebasic
      ;
      Message.s = ""
      ExamineIPAddresses()
      Repeat
        Result = NextIPAddress()
        If Result <> 0
            Message + IPString(Result) + Chr(10)
          Else
            Break
        EndIf
      ForEver
      MessageRequester("Local IPs", Message, #PB_MessageRequester_Ok)
      ;
      ; Pour récupérer l'IP externe du réseau
      ;
      MessageRequester("External IP", "Your IP address is : " + MyIP(), #PB_MessageRequester_Ok)
      ;
      ; Pour lister les PC accessibles sur le réseau local
      ;
      LocalServerName.s = Space(255)
      gethostname_(@LocalServerName, 255)
      ServerName.SERVER_INFO_100
      ServerName\sv100_platform_id = 0
      ServerName\sv100_name = Ansi2Uni("\\" + LocalServerName)
      Message.s = ""
      Repeat
        Result = NetServerEnum_(Ansi2Uni(""), 100, @ServerName, prefmaxlen = 65536, @entriesread, @totalentries, servertype = #SV_TYPE_ALL, #Null, 0)
        Select Result
          Case #NERR_SUCCESS
            AddElement(ServerList())
            ServerList() = Uni2Ansi(ServerName\sv100_name)
          Case #ERROR_ACCESS_DENIED
            Message + "The user does not have access to the requested information." + Chr(10)
          Case #NERR_INVALIDCOMPUTER
            Message + "The computer name is invalid." + Chr(10)
          Case #ERROR_NO_BROWSER_SERVERS_FOUND
            Message + "No browser servers found." + Chr(10)
          Case #ERROR_MORE_DATA
            Message + "More entries are available with subsequent calls." + Chr(10)
          Default
            Message + "Unknown message" + Chr(10)
        EndSelect
      Until Result <> #NERR_SUCCESS Or entriesread = totalentries ; = #NERR_MOREDATA
      ForEach ServerList()
        Message + ServerList() + " " + GetIPbyName(ServerList()) + Chr(10)
      Next
      MessageRequester("PCs enum", Message, #PB_MessageRequester_Ok)
    Else
      MessageRequester("Error", "Can't open the network", #PB_MessageRequester_Ok)
  EndIf
End

Publié : mer. 28/sept./2005 11:25
par Simon
Bah il y a juste un truc qui ne marche pas chez moi c'est ça :

L.93 CopyMemory (pHostinfo, hostinfo.HOSTENT, SizeOf(HOSTENT))

Message : structure not found (HOSTENT) ...


Voila sinon ça marche bien mais tu pourrais me dire a quoi ser tout les trucs au tout début du genre : #SV_TYPE_WORKSTATION = $00000001

c'est le nom que tu donne a tes Gadgets ou autre ??

et moi non plus je ne suis pas en condition de tester.

Publié : mer. 28/sept./2005 11:49
par fweil
La structure HOSTENT est bien incluse dans la 3.94. Es-tu à jour ?

Sinon voici le descripteur de la structure :

Structure HOSTENT
h_name.l
h_alias.l
h_addr.w
h_len.w
h_list.l
EndStructure

Pour les constantes en début de programme, j'ai mis le stock de constantes qui peuvent servir pour l'énumération des postes. Mais ici je n'utilise que le type All (#SV_TYPE_ALL) dans la commande NetServerEnum_().

Le reste des constantes peut servir pour filtrer le type de postes que l'on veut recenser.

Publié : mer. 28/sept./2005 12:39
par Simon
ha !!!!! c 'est pour ça j'ai la version 3.93 moi :lol:

sinon merci pour cette astuce mais je peux te recontacter si tu veux dés que le reseau marche bien dans environ 1 semaine ...

Aller ++

Publié : mer. 28/sept./2005 17:15
par fweil
@Simon,

Ben j'espère bien que tu me diras ce que ça donne et si il faut corriger ou ajoueter des trucs, on le fera ensemble.