Differenze tra le versioni di "Ottenere gli indirizzi IP di ogni interfaccia presente sulla medesima macchina"
Da Gambas-it.org - Wikipedia.
(Creata pagina con "Per ottenere gli indirizzi IP di ogni interfaccia eventualmente presente sulla medesima macchina, è possibile utilizzare il seguente semplice codice: Library "libc:6" Pub...") |
|||
Riga 52: | Riga 52: | ||
If getifaddrs(VarPtr(p)) == -1 Then Error.Raise("Errore !") | If getifaddrs(VarPtr(p)) == -1 Then Error.Raise("Errore !") | ||
− | ifa = p | + | ifa = p <FONT Color=gray>' <SUP>[[[#Note|Nota 1]]]</sup> |
While Not IsNull(ifa.ifa_next) | While Not IsNull(ifa.ifa_next) | ||
Riga 65: | Riga 65: | ||
'''End''' | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Per questa assegnazione di un Puntatore ad una Struttura vedere: | ||
+ | *[[Assegnare_un_Puntatore_ad_una_Struttura_per_dereferenziarlo|Assegnare un Puntatore ad una Struttura per dereferenziarlo]] | ||
+ | * [[Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura,_passato_da_una_funzione_esterna|Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna]] | ||
Versione delle 09:02, 17 ago 2020
Per ottenere gli indirizzi IP di ogni interfaccia eventualmente presente sulla medesima macchina, è possibile utilizzare il seguente semplice codice:
Library "libc:6" Public Struct sockaddr sa_ As Short sa_data[14] As Byte End Struct Public Struct sockaddr_in sin_ As Short sin_port As Short sin_addr As Integer sin_zero[8] As Byte End Struct Public Struct ifaddrs ' /usr/include/ifaddrs.h ifa_next As Pointer ifa_name As Pointer ifa_flags As Integer ifa_addr As Pointer ifa_netmask As Pointer ifa_ifu As Pointer ifa_data As Pointer End Struct Private Const NI_NUMERICHOST As Integer = 1 Private Const AF_INET As Integer = 2 Private Const NI_MAXHOST As Integer = 1025 ' int getifaddrs (struct ifaddrs **__ifap) ' Create a linked list of `struct ifaddrs' structures. Private Extern getifaddrs(__ifap As Pointer) As Integer ' int getnameinfo (const struct sockaddr *__sa, socklen_t __salen, char * __host, socklen_t __hostlen, char * __serv, socklen_t __servlen, int __flags) ' Translate a socket address to a location and service name. Private Extern getnameinfo(__sa As Sockaddr, __salen As Integer, __host As Pointer, __hostlen As Integer, __serv As Pointer, __servlen As Integer, __flags As Integer) As Integer ' const char *gai_strerror (int __ecode) ' Convert error return from getaddrinfo() to a string. Private Extern gai_strerror(__ecode As Integer) As String Public Sub Main() Dim ifa As Ifaddrs Dim i As Integer Dim host As New Byte[NI_MAXHOST] Dim sai As New Sockaddr_in Dim soad As Sockaddr Dim p As Pointer If getifaddrs(VarPtr(p)) == -1 Then Error.Raise("Errore !") ifa = p ' [Nota 1] While Not IsNull(ifa.ifa_next) soad = ifa.ifa_addr If soad.sa_ == AF_INET Then i = getnameinfo(ifa.ifa_addr, Object.SizeOf(sai), host.Data, NI_MAXHOST, 0, 0, NI_NUMERICHOST) If i > 0 Then Error.Raise("Errore: " & gai_strerror(i)) Print "\e[0mInterfaccia: \e[1m"; String@(ifa.ifa_name); "\e[0m \tIndirizzo: \e[31m"; String@(host.Data) Endif ifa = ifa.ifa_next Wend End
Note
[1] Per questa assegnazione di un Puntatore ad una Struttura vedere:
- Assegnare un Puntatore ad una Struttura per dereferenziarlo
- Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna