どうすれば Internet Protocol version 4Dns.GetHostAddresses()
からアドレスを取得できますか?私は以下のコードを持っています、そしてそれは私にIPv4とIPv6アドレスを与えます。複数のIPv4アドレスを持つボックスで動作するようにしなければなりません。
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
{
foreach (IPAddress a in localIPs)
{
server_ip = server_ip + a.ToString() + "/";
}
}
このようなものをコードに追加します
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
私のブログ から:
_/// <summary>
/// This utility function displays all the IP (v4, not v6) addresses of the local computer.
/// </summary>
public static void DisplayIPAddresses()
{
StringBuilder sb = new StringBuilder();
// Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface network in networkInterfaces)
{
// Read the IP configuration for each network
IPInterfaceProperties properties = network.GetIPProperties();
// Each network interface may have multiple IP addresses
foreach (IPAddressInformation address in properties.UnicastAddresses)
{
// We're only interested in IPv4 addresses for now
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
continue;
// Ignore loopback addresses (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address))
continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")");
}
}
MessageBox.Show(sb.ToString());
}
_
特に、私はnotをお勧めしますDns.GetHostAddresses(Dns.GetHostName());
は、その行がさまざまな記事やブログでどれだけ人気があるかに関係なくお勧めします。
私が使用する関数は次のとおりです。
public static string GetIP4Address()
{
string IP4Address = String.Empty;
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IPA.AddressFamily == AddressFamily.InterNetwork)
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
}
列挙可能として:
public static IEnumerable<string> GetIP4Addresses()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
.Select(x => x.ToString());
}
Linqを使用すると非常にきれいで甘い
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
と書く
空の文字列がホスト名として渡されると、このメソッドはWindows Server 2003を除くすべてのオペレーティングシステムのローカルホストのIPv4アドレスを返します。 Windows Server 2003の場合、ローカルホストのIPv4アドレスとIPv6アドレスの両方が返されます。
ローカルコンピューターにIPv6がインストールされていない場合、IPv6アドレスはGetHostAddressesメソッドの結果からフィルター処理されます。その結果、hostNameOrAddress.parameterでIPv6のみが使用可能な場合、空のIPAddressインスタンスを取得することができます。
そのため、これを使用して 試行して解析 :
IPAddress.TryParse
次に、AddressFamily
を確認します。
IPv4の場合はSystem.Net.Sockets.AddressFamily.InterNetworkを、IPv6の場合はSystem.Net.Sockets.AddressFamily.InterNetworkV6を返します。
string input = "192.168.0.10";
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
// we have IPv4
break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
// we have IPv6
break;
default:
// do something else
break;
}
}
で始まる答えを使用しました
/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
私は使用しなければなりませんでした:
if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
しかし、私は実際に使用しました:
if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))
また、私は追加しました:
if (network.OperationalStatus != OperationalStatus.Up)
continue;
動作しなかったはずのネットワークがいくつかあったため、レジストリに登録されていたことがわかりました。 - -アルヴィン
このヘルパーメソッドを使用して、IPV6とループバックを一度フィルターで除外した後、最初のアクティブなIPV4アドレスを返します
public static IPAddress GetLocalIPAddress()
{
IPAddress result = null;
IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add));
if (ipv4Address.Length > 0 )
{
result =ipv4Address[0];
}
return result;
}
私にとって、よりクリーンなソリューションは次のとおりです。
public static string GetLocalIP()
{
string ipv4Address = String.Empty;
foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
ipv4Address = currentIPAddress.ToString();
break;
}
}
return ipv4Address;
}
Forループを使用して、最初に接続されたIPv4を見つけるコードを次に示します。
IPAddress ipAddress = null;
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
for (int i=0 ; i<localIPs.Length ; i++)
{
if (localIPs[i].AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = localIPs[i];
break;
}
}
これは私のコードです。そして、多くのLANカードで見つけることができます。
private string GetLocalIpAddress()
{
string localIpAddress = string.Empty;
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
if (nic.OperationalStatus != OperationalStatus.Up)
{
continue;
}
IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics();
UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses;
if (uniCast != null)
{
foreach (UnicastIPAddressInformation uni in uniCast)
{
if (adapterStat.UnicastPacketsReceived > 0
&& adapterStat.UnicastPacketsSent > 0
&& nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
{
if (uni.Address.AddressFamily == AddressFamily.InterNetwork)
{
localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString();
break;
}
}
}
}
}
return localIpAddress;
}