C#で、IPアドレスを取得する際、Dns.GetHostEntryを使うという記事がよく出てきます。
当然、DNSサーバを利用する前提なので、DNSサーバから正引きできないと、
結局は、ローカルループバックアドレスしか取れなかったりします。
ローカルネットワークであっても、
consulやdnsmasqなどをつかって、DNS設定くらいちゃんとしとけよというのはもちろんですが、
IPアドレスだけで済むなら、そうしたいのものかと思います。(WINSサーバについては不明です)
このように、正引きできないが、ローカルアドレスを取りたい場合、
NICを直接見に行くほうが楽です。
自分のTCPサーバ・クライアントライブラリに、将来的に使いそうな気がして、実装しておきました。
https://github.com/shigenobu/PurpleSofa/blob/master/PurpleSofa/PsNetwork.cs
v4のアドレス取得部分だけ抜粋します。
private static readonly IEnumerable<NetworkInterface> NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces()
.Where(i =>
i.OperationalStatus == OperationalStatus.Up &&
i.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
i.NetworkInterfaceType != NetworkInterfaceType.Loopback);
public static IEnumerable<IPAddress> GetLocalIpv4Addresses()
{
List<IPAddress> addresses = new();
foreach (var networkInterface in NetworkInterfaces)
{
var address = networkInterface.GetIPProperties().UnicastAddresses
.Where(a => a.Address.AddressFamily == AddressFamily.InterNetwork)
.Select(a => a.Address)
.FirstOrDefault();
if (address != null)
addresses.Add(address);
}
return addresses;
}
要は、起動中のイーサネットのNICだけを取得して、それをIEnumerableで返している感じです。
これでWIFIも取れるかと思います。(LINUXでは大丈夫だったが)
NICを複数持っているケース、
たとえばゲートウェイサーバのように、外向きと内向きのアドレスを持つ場合などについては、
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.httpoverrides.ipnetwork?view=aspnetcore-7.0
なんていうクラス(ASPですが)を使うことで、
取得したアドレスが、指定のアドレス範囲内かどうかを判断して、取捨選択も出来るかと思います。
以上
コメントがあればどうぞ