4

IP がサブネット マスク + ローカル IP ルールの範囲外にある場合、その IP にはゲートウェイ経由でしか到達できないことを知っています。問題は、.NET を使用してプログラムでローカル IP アドレスを取得する方法も、ローカル サブネット マスクも取得する方法がわからないことです。誰でも私を助けることができますか?

この情報を使用して、バッチ SQL 挿入キューから最大のパフォーマンスを引き出します。SQL サーバーが同じサブネット内にある場合は、待ち時間が最小になるように最適化されたアルゴリズムを使用します。それ以外の場合は、待ち時間が長くなるように最適化されたアルゴリズムを使用します。

4

3 に答える 3

10

System.Net.NetworkInformation 名前空間 (.NET 2.0 で導入) 内のクラスを使用できます。

        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface iface in interfaces)
        {
            IPInterfaceProperties properties = iface.GetIPProperties();

            foreach (UnicastIPAddressInformation address in properties.UnicastAddresses)
            {
                Console.WriteLine(
                    "{0} (Mask: {1})",
                    address.Address,
                    address.IPv4Mask
                    );
            }
        }
于 2009-01-06T14:00:51.227 に答える
4

NetworkInformationクラスを使用する別の方法があります。

public static void ShowNetworkInterfaces()
{
    // IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    if (nics == null || nics.Length < 1)
    {
        Console.WriteLine("  No network interfaces found.");
        return;
    }

    Console.WriteLine("  Number of interfaces .................... : {0}", nics.Length);
    foreach (NetworkInterface adapter in nics)
    {
        IPInterfaceProperties properties = adapter.GetIPProperties();
        Console.WriteLine();
        Console.WriteLine(adapter.Description);
        Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length,'='));
        Console.WriteLine("  Interface type .......................... : {0}", adapter.NetworkInterfaceType);
        Console.WriteLine("  Physical Address ........................ : {0}", adapter.GetPhysicalAddress().ToString());
        string versions ="";

        // Create a display string for the supported IP versions.
        if (adapter.Supports(NetworkInterfaceComponent.IPv4))
        {
            versions = "IPv4";
        }
        if (adapter.Supports(NetworkInterfaceComponent.IPv6))
        {
            if (versions.Length > 0)
            {
                versions += " ";
            }
            versions += "IPv6";
        }
        Console.WriteLine("  IP version .............................. : {0}", versions);
        UnicastIPAddressInformationCollection uniCast = properties.UnicastAddresses;
        if (uniCast != null)
        {
            foreach (UnicastIPAddressInformation uni in uniCast)
            {
                Console.WriteLine("  Unicast Address ......................... : {0}", uni.Address);
                Console.WriteLine("     Subnet Mask  ......................... : {0}", uni.IPv4Mask);
            }
        }
    Console.WriteLine();
    }
}

コードサンプルは、Msdnが提供する例のマッシュアップであり、おそらく必要な情報のみを表示するように簡略化されています。

編集:この投稿をするのに時間がかかりすぎた(同時に多すぎる:))、そしてミッチはそれに私を打ち負かした:)

于 2009-01-06T14:43:27.350 に答える
1

これにより、ホスト名と IP アドレスが取得されます。LAN内のIPを知っていると仮定しているので、そのIPアドレスがLANの外にあるかどうかを判断できるはずです:

// Get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);

// Using the host name, get the IP address list.
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
     Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
于 2009-01-06T13:50:11.763 に答える