So che questo potrebbe dare dei calci a un cavallo morto, ma forse questo può aiutare qualcuno. Ho cercato dappertutto un modo per trovare il mio indirizzo IP locale, ma ovunque trovo che dice di usare:
Dns.GetHostEntry(Dns.GetHostName());
Non mi piace affatto perché ottiene tutti gli indirizzi assegnati al tuo computer. Se si dispone di più interfacce di rete (che praticamente tutti i computer fanno ora al giorno) non si ha idea di quale indirizzo corrisponda a quale interfaccia di rete. Dopo aver fatto un sacco di ricerche, ho creato una funzione per utilizzare la classe NetworkInterface e strapparne le informazioni. In questo modo posso dire che tipo di interfaccia è (Ethernet, wireless, loopback, tunnel, ecc.), Se è attiva o meno e SOOO molto di più.
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
Ora per ottenere l'indirizzo IPv4 della chiamata dell'interfaccia di rete Ethernet:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
O la tua interfaccia wireless:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Se si tenta di ottenere un indirizzo IPv4 per un'interfaccia wireless, ma sul computer non è installata una scheda wireless, verrà restituita una stringa vuota. Stessa cosa con l'interfaccia Ethernet.
Spero che questo aiuti qualcuno! :-)
MODIFICARE:
È stato sottolineato (grazie a @NasBanov) che anche se questa funzione consente di estrarre l'indirizzo IP in un modo molto migliore rispetto all'utilizzo Dns.GetHostEntry(Dns.GetHostName())
non funziona molto bene nel supportare più interfacce dello stesso tipo o più indirizzi IP su una singola interfaccia . Restituirà un solo indirizzo IP quando potrebbero essere assegnati più indirizzi. Per restituire TUTTI questi indirizzi assegnati, è possibile semplicemente manipolare la funzione originale per restituire sempre un array anziché una singola stringa. Per esempio:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
Ora questa funzione restituirà TUTTI gli indirizzi assegnati per uno specifico tipo di interfaccia. Ora per ottenere una sola stringa, è possibile utilizzare l' .FirstOrDefault()
estensione per restituire il primo elemento dell'array o, se è vuoto, restituire una stringa vuota.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
Questa affermazione sembra contraddittoria. Stai cercando di capire se il tuo computer è connesso a una LAN privata o a Internet?