Newsgroup: it.comp.lang.visual-basic
Titolo: Indirizzo Ip

Come posso ricavare l' indirizzo ip con cui sono collegato ad internet da
visual basic???

 visual basic???
Un mio vecchio post; riveduto, corretto e integrato.
Integrato con il mini-tutorial che segue, visto che altrimenti mi
scriveresti in privato per chiarimenti (lo fanno tutti).
Se chiarimenti ti servono ugualmente, please, scrivi al NG.
Begin Mini-tutorial ====================================
Ad un host possono essere assegnati più indirizzi IP contemporaneamente.
Nel caso più semplice, una workstation Win9x, si possono
avere 3 indirizzi IP principali. Con due schede di rete installate:
1° IP  - Host IP in binding a eth(0)
2° IP  - Host IP in binding a eth(1)
3° IP  - Host IP in binding a dun/ras
In condizioni normali, fino a 17 in una wrk/server NT.
In relazione ad un host remoto, il numero degli IP address ritornato
è determinato dal DNS che risponde alla chiamata. Se un host
ha degli alias, in genere viene tornato l'alias ufficiale (FQDN) come
puntatore alla stringa nel membro .hName della struttura HOSTENT.
Gli altri alias vengono recuperati tramite .hAliases, puntatore
ad un puntatore che referenzia un array di nomi alternativi.
Il membro .hAddrList è il puntatore ad un puntatore che referenzia
un array di indirizzi in network byte order (net address) associati
agli alias, oltre all'elenco degli alias.
Si usa la funzione inet_ntoa() per convertire il net address in un
IP address in formato stringa. La funzione restituisce un
puntatore a tale stringa. La funzione NetAddressToIPAddress()
è un wrapper per inet_ntoa().
Volendo recuperare tutti gli indirizzi IP primari associati ad un
host, occorre conoscere la logica impiegata per referenziare gli
indirizzi nella struttura HOSTENT.
La struttura HOSTENT deve essere così dichiarata:
Public Type HOSTENT
   hName As Long
   hAliases As Long
   hAddrType As Integer
   hLen As Integer
   hAddrList As Long
End Type
La struttura utilizzata per la memorizzazione degli indirizzi è la seguente:
    => char FAR * FAR * hAddrList;
    => char FAR * FAR * hAliases;
[Host IP(1)][Host IP(x)][Host Alias(1)][Host Alias(y)][Null]
^                                   ^
** hAddrList                 ** hAliases
Vengono elencati, in serie, prima gli indirizzi IP e in seguito
i nomi degli host associati. L'array (stringa) è null-terminated.
[Host Alias(1)] è sempre il nome dell'host di cui si è richiesto
l'indirizzo IP [Host IP(1)]. In seguito tutti gli altri indirizzi e
nomi eventualmente esistenti. Non è detto che a tutti gli
indirizzi IP corrisponda sempre un nome di host. O, meglio,
ad un singolo nome di host possono corrispondere più indirizzi IP.
Quindi ** hAddrList referenzia la locazione di inizio dell'area di
memorizzazione dei dati realtivi ad indirizzi e nomi di host.
** hAliases referenzia la locazione di inizio dell'area contigua di
memorizzazione dei dati relativi ai soli nomi di host.
La dimensione in byte di un indirizzo IP è definita dal membro
.hLen della struttura HOSTENT. In genere il valore è 4, ma
potrebbe anche essere 6, nel caso di indirizzi IpV6.
Le locazioni di memoria referenziate da .hAddrList e .hAliases si
ottengono in questo modo (occorre ricordare che stiamo trattando
puntatori a puntatori).
      CopyMemory [StartMemAddress], HOSTENT.hAddrList, 4
      CopyMemory [HostsMemAddress], HOSTENT.hAliases, 4
Nel caso in cui l'host non abbia degli alias, il riferimento
**.hAliases sarà = 0. Nel caso:
    [HostsMemAddress] = HOSTENT.hName
Visto che [StartMemAddress] e [HostsMemAddress] sono locazioni
di memoria contigua, si può ricavare, in base allo schema visto in
precedenza, la dimensione in byte dell'area di memoria in cui sono
definiti gli indirizzi IP:
    [IPAddrBytes] = [HostsMemAddress] - [StartMemAddress]
il numero di indirizzi IP registrati è quindi dato da:
    [IPAddrNum] = [IPAddrBytes] / HOSTENT.hLen
E' possibile così costruire un array per memorizzare gli indirizzi
IP associati all'host richiesto.
    Redim [IPAddrArray](1 To [IPAddrNum])
[IPAddrArray](1) sarà sempre l'indirizzo IP primario dell'host.
Nel caso dell'host locale - se è presente una scheda di rete - sarà
l'indirizzo IP assegnato al binding alla scheda di rete.
[IPAddrArray]([IPAddrNum]) sarà l'IP assegnato alla connessione
DUN/RAS, quando questa è presente.
Se l'host locale non ha una scheda di rete, [IPAddrArray](1) sarà
127.0.0.1 in assenza di connessione remota; in presenza di connessione
sarà l'indirizzo IP dinamico assegnato (se non è presente un IP statico).
In questo caso [IPAddrNum] = 1.
Occorre ricordare che se l'host locale accede ad una connessione
remota tramite la rete (ossia tramite un Router o un Proxy), all'host
non verrà assegnato un indirizzo dinamico.
L'indirizzo dinamico viene assegnato solo al Router o alla sola
macchina in cui il Proxy è installato. Router è Proxy in genere
dispongono delle funzioni NAT che permettono l'indirizzamento
dei pacchetti agli host collegati.
L'esempio
Quella che segue è la procedura minima per recuperare l'IP address di
un host. Restituisce solo il primo indirizzo associato all'host.
Se si sta cercando di ottenere l'indirizzo IP dinamico assegnato
all'host tramite una connessione DUN/RAS, l'indirizzo restituito
sarà quello cercato solo se l'host non dispone di una scheda di rete.
La funzione GetHostIPAddress() recupera comunque tutti gli IP
Address assegnati all'host. E' quindi facilmente modificabile al fine
di ottenere un'eventuale indirizzo dinamico.
E' sufficiente far ritornare alla funzione l'upper bound dell'array
di indirizzi invece che il lower bound.
Ossia [IPAddrArray]([IPAddrNum])
End Mini-tutorial ======================================
Alla funzione GetHostIPAddress() passi il nome dell'host e un buffer
(strHostAlias) che ritorna l'FQDN dell'host. Se non sai come
ottene il nome dell'host, vedi la funzione dell'API Winsock:
Public Declare Function gethostname Lib "wsock32.dll" _
        (ByVal szHost As String, _
        ByVal dwHostLen As Long) As Long
Non usare la funzione del Kernel GetComputerName(); è noto
che il nome dell'host può differire dal nome del computer.
=======================================================
Le strutture e le funzioni chiamate le trovi nell'API Text Viewer (aggiornato).
Riporto solo la dichiarazione della funzione inet_ntoa perché uso
una forma modificata.
Public Declare Function inet_ntoa Lib "Wsock32.dll" ( _
          ByVal lIn As Long) As Long
Le funzioni che seguono devono essere utilizzate in questo modo:
    'Avvia l'istanza del socket per il processo
    SocketInitialize()
    'Passa alla funzione il nome dell'host, un buffer in cui viene
    'inserito l'FQDN dell'host. La funzione restiruisce l'IP Address
    [Ip Address] = GetHostIPAddress([NomeHost], [HostAliasBuffer])
    'Chiude il socket
    SocketCleanup()
=======================================================
Public Function GetHostIPAddress( _
           lpszHostName As String, _
           strHostAlias As String) As String
Dim HostentAddr As Long
Dim HostNameAddr As Long
Dim HostIPAddr() As Long
Dim HostIPNum As Integer
Dim Host As Hostent
Dim strAddress As String
Dim Counter As Integer
   strAddress = lpszHostName
   'Fully Qualified Domain Name dell'host
   strHostAlias = String(255, 0)
   'Ottiene informazioni sull'host indicato
   HostentAddr = gethostbyname(strAddress)
   If HostentAddr = SOCKET_ERROR Then
      'Si è verificato un errore
      HostentAddr = WSAGetLastError()
      GetHostIPAddress = ""
   ElseIf HostentAddr = 0 Then
      'Host non trovato
      GetHostIPAddress = ""
   Else
      'Copia la struttura puntata da HostentAddr nella struttura Host
      CopyMemory Host, ByVal HostentAddr, Len(Host)
      'Recupera il network address dell'host. Il doppio passaggio
      'si rende necessario perché il valore contenuto in .hAddrList
      'e in .hAliases è il puntatore ad un puntatore
      '-------------------------------------------------------------------
      'Ottiene l'elenco dei net address memorizzati.
      'HostentAddr è il puntatore allo start address
      'dell'area di memorizzazone. L'elenco inizia con gli
      'indirizzi IP associati all'host indicato.
      'HostNameAddr è il puntatore all'area contigua di
      'memoria dove ha inizio l'elenco dei nomi di host.
      'Host.hLen è la dimensione in byte di un indirizzo.
      CopyMemory HostentAddr, Host.hAddrList, 4
      CopyMemory HostNameAddr, Host.hAliases, 4
      'Numero di indirizzi IP memorizzati
      If HostNameAddr > 0 Then
         HostIPNum = ((HostNameAddr - HostentAddr) / Host.hLen)
      Else
         HostIPNum = ((Host.hName - HostentAddr) / Host.hLen)
      End If
      ReDim HostIPAddr(1 To HostIPNum)
      'Crea l'array degli indirizzi
      For Counter = 1 To HostIPNum
         CopyMemory HostIPAddr(Counter), _
                                HostentAddr + ((Counter - 1) * Host.hLen), _
                                Host.hLen
      Next Counter
      '-------------------------------------------------------------------
      'Recupera il FQDN dell'host
      CopyMemory ByVal strHostAlias, Host.hName, 255
      strHostAlias = Left$(strHostAlias, InStr(strHostAlias, Chr$(0)) - 1)
      'Converte il network address dell'host nell'indirizzo IP
      strAddress = NetAddressToIPAddress(HostIPAddr(HostIPNum))
      GetHostIPAddress = strAddress
   End If
End Function
=======================================================
Public Function SocketsInitialize() As Boolean
'
' Funzione "standard", ricavata da MS SDK
'
Dim WSAD As WSAdata
Dim lngRet As Long
Dim szLoByte As String
Dim szHiByte As String
Dim szBuf As String
   lngRet = WSAStartup(WS_VERSION_REQD, WSAD)
   If lngRet <> 0 Then
       MsgBox "Il Sockets Win32 non risponde.", vbCritical, "Errore Socket"
       SocketsInitialize = False
       Exit Function
   End If
   'Controlla che la versione del socket in dotazione sia
   'adeguata (1.01 o sup.) alle funzioni che vengono usate
   If (LoByte(WSAD.wVersion) < WS_VERSION_MAJOR) Or _
      (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR) And _
       (HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
       szHiByte = Format$(HiByte(WSAD.wVersion))
       szLoByte = Format$(LoByte(WSAD.wVersion))
       szBuf = "Il Sockets versione " & szLoByte & "." & szHiByte
       szBuf = szBuf & " non è supportato da Windows in ambiente 32 bit."
       MsgBox szBuf, vbCritical, "Errore Socket"
       SocketsInitialize = False
       Exit Function
   End If
   'I socket disponibili sono insufficienti per l'applicazione
   If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
       szBuf = "L'applicazione richiede almeno " & _
                Format$(MIN_SOCKETS_REQD) & " socket disponibili."
       MsgBox szBuf, vbCritical, "Errore Socket"
       SocketsInitialize = False
       Exit Function
   End If
   SocketsInitialize = True
End Function
Public Function SocketsCleanup() As Boolean
'
' Funzione "standard", ricavata da MS SDK
'
Dim retLng As Long
   retLng = WSACleanup()
   If retLng <> 0 Then
       MsgBox "Si è verificato un errore in fase di chiusura del Socket." & Chr$(13) & _
            "Numero ell'errore: " & Format$(retLng), vbExclamation, "Errore Socket"
       SocketsCleanup = False
   Else
       SocketsCleanup = True
   End If
End Function
Public Function NetAddressToIPAddress(lngAddress As Long) As String
Dim strAddress As String
Dim lngPointer As Long
Dim sAddress As Long
   If lngAddress = 0 Then
      'L'indirizzo è nullo
      Exit Function
   End If
   sAddress = lngAddress
   lngPointer = inet_ntoa(sAddress)
   strAddress = String(32, Chr$(0))
   CopyMemory ByVal strAddress, lngPointer, 32
   If strAddress <> "" Then
      NetAddressToIPAddress = Left$(strAddress, InStr(strAddress, Chr$(0)) - 1)
   Else
      NetAddressToIPAddress = strAddress
   End If
End Function
=======================================================

Jimi, bisognerebbe prenderti le palle ed appenderle bene incorniciate in
bacheca.
6 grande !
Ciao
Aldo

 6 grande !
per jimi forse e' tardi, quanto a me spero vivamente di non fare mai nulla
che possa suscitare il tuo apprezzamento.

 bacheca.
Prendere che ???
Sorry, object(s) not available.

 Sorry, object(s) not available.
di solito l'operativo non dice "sorry".
dice "not found" :)))