Newsgroup: it.comp.lang.visual-basic
Titolo: TCP/IP ->

In una rete locale dato l'indirizzo TCP/IP e' possibile sapere il nome del
PC

 PC
Certamente.
(Occhio alla dichiarazione di gethostbyaddr(), è modificata rispetto
alla notazione comune - che è sballata e inutilizzabile).
Prima di chiamare la funzione primaria, GetHostNameByIPAddress(),
è necessario inizializzare il socket. Usa la funzione SocketsInitialize().
In chiusura occorre ripulire il socket. Usa SocketsCleanup().
'Dichiarazioni ===========================
Public Const AF_INET = 2
Public Type Hostent
   hName As Long
   hAliases As Long
   hAddrType As Integer
   hLen As Integer
   hAddrList As Long
End Type
Public Declare Function gethostbyaddr Lib "wsock32.dll" _
   (lngIPAddress As Long, _
   ByVal AddressLen As Long, _
   ByVal AddressType As Long) As Long
Public Declare Function inet_addr Lib "wsock32.dll" _
   (ByVal lpszIPAddress As String) As Long
Public Declare Function WSAStartup Lib "wsock32.dll" _
   (ByVal wVersionRequired As Long, _
    lpWSAdata As WSAdata) As Long
Public Declare Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare Function WSAGetLastError Lib "wsock32.dll" () As Long
=======================================
Public Function GetHostNameByIPAddress( _
          lpszAddress As String) As String
Dim HostIPAddr As Long
Dim HostentAddr As Long
Dim Host As Hostent
Dim strAddress As String
Dim strHostAlias As String
   strAddress = lpszAddress
   'Fully Qualified Domain Name dell'host cercato
   strHostAlias = String(255, Chr$(0))
   'Converte l'indirizzo in formato "Dotted decimal"
   'nella sua rappresentazione binaria
   HostIPAddr = IPAddressToNetAddress(lpszAddress)
   'Restituisce l'indirizzo di una struttura Hostent che conterrà
   'le informazioni sull'host specificato
   HostentAddr = gethostbyaddr(HostIPAddr, 4, AF_INET)
   If HostentAddr = SOCKET_ERROR Then
      'Si è verificato un errore
      HostentAddr = WSAGetLastError()
      ' [...] da personalizzare
      GetHostNameByIPAddress = ""
   Else
      'Copia la struttura puntata da HostentAddr nella struttura Host
      CopyMemory Host, ByVal HostentAddr, Len(Host)
      'Recupera il FQDN dell'host
      CopyMemory ByVal strHostAlias, ByVal Host.hName, 255
      strHostAlias = Left$(strHostAlias, InStr(strHostAlias, Chr$(0)) - 1)
      GetHostNameByIPAddress = strHostAlias
   End If
End Function
'Conversione dell'indirizzo IP da Ascii a Net Binary ====
Public Function IPAddressToNetAddress( _
           ByVal lpszAddress As String) As Long
Dim lngAddress As Long
   'La funzione inet_addr restituisce la rappresentazione
   'binaria di un indirizzo IP
   lngAddress = inet_addr(lpszAddress)
   IPAddressToNetAddress = lngAddress
End Function
'Inizializzazione del socket ==============
Public Function SocketsInitialize() As Boolean
'Funzione standard: inizializzazione del socket
Dim WSAD As WSAdata
Dim lngRet As Long
   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
   SocketsInitialize = True
End Function
'Chiusura del socket ==================
Public Function SocketsCleanup() As Boolean
'Funzione standard: chiusura del socket
Dim lngReply As Long
   lngReply = WSACleanup()
   If lngReply <> 0 Then
       MsgBox "Si è verificato un errore in fase di chiusura del Socket." & Chr$(13) & _
            "Numero ell'errore: " & Format$(lngReply), vbExclamation, "Errore Socket"
       SocketsCleanup = False
   Else
       SocketsCleanup = True
   End If
End Function