ここには、IPv4マシンでうまく機能するコードがいくつかありますが、ビルドサーバー(IPv6)では失敗します。一言で言えば:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
GetHostEntryのドキュメントには、string.Emptyを渡すと、localhostのIPv4アドレスが取得されると書かれています。これは私が欲しいものです。問題は、IPv6マシンで文字列「:: 1:」を返すことです。これはIPv6アドレスだと思います。
他のIPv4マシンからマシンにpingを実行すると、良好なIPv4アドレスが得られます。.."ping -4 machinename"を実行すると、正しいIPv4アドレスが得られます。 「:: 1:」。
このマシンのIPv4をそれ自体から取得するにはどうすればよいですか?
すべてのアドレス を見て、 family InterNetworkV6 を破棄し、IPv4のみを保持しましたか?
すべてのローカルIPv4アドレスを見つけるには:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
または、必要な場合はArray.Find
またはArray.FindLast
を使用します。
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
public Form1()
{
InitializeComponent();
string myHost = System.Net.Dns.GetHostName();
string myIP = null;
for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
{
myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
}
}
}
Public変数でmyIPとmyHostを宣言し、フォームの任意の関数で使用します。
public static string GetIPAddress(string hostname)
{
IPHostEntry Host;
Host = Dns.GetHostEntry(hostname);
foreach (IPAddress ip in Host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
return ip.ToString();
}
}
return string.Empty;
}
すべての有効なアドレス一覧を見つけるには、これが使用したコードです
public static IEnumerable<string> GetAddresses()
{
var Host = Dns.GetHostEntry(Dns.GetHostName());
return (from ip in Host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}