Как получить IP-адрес в C #? - PullRequest
4 голосов
/ 29 декабря 2010

Предположим, что компьютер подключен ко многим сетям (на самом деле к нескольким).

Я могу получить список IP-адресов, который включает все IP-адреса, которые компьютер имеет в сетях, но как узнать, какой IP-адрес принадлежит какой сети?

1 Ответ

4 голосов
/ 29 декабря 2010

Во-первых, есть несколько терминов, которые вам нужно знать. Эти примеры номеров предполагают сеть IPv4.

  • IP-адрес (192.168.1.1)
  • маска подсети (255.255.255.0)
  • сетевой адрес (192.168.1.0)
  • сетевая карта, NIC (одна аппаратная карта может иметь несколько из них)

Чтобы узнать, к какой сети принадлежит IP-адрес, необходимо рассчитать сетевой адрес. Это легко, если вы берете свой IP-адрес (либо в виде байта [4], либо в виде UInt64) и поразрядно «и» с маской подсети.

using System;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;

namespace ConsoleApplication {
    public static class ConsoleApp {
        public static void Main() {
            var nics = NetworkInterface.GetAllNetworkInterfaces();
            foreach (var nic in nics) {
                var ipProps = nic.GetIPProperties();

                // We're only interested in IPv4 addresses for this example.
                var ipv4Addrs = ipProps.UnicastAddresses
                    .Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork);

                foreach (var addr in ipv4Addrs) {
                    var network = CalculateNetwork(addr);
                    if (network != null)
                        Console.WriteLine("Addr: {0}   Mask: {1}  Network: {2}", addr.Address, addr.IPv4Mask, network);
                }
            }
        }

        private static IPAddress CalculateNetwork(UnicastIPAddressInformation addr) {
            // The mask will be null in some scenarios, like a dhcp address 169.254.x.x
            if (addr.IPv4Mask == null)
                return null;

            var ip = addr.Address.GetAddressBytes();
            var mask = addr.IPv4Mask.GetAddressBytes();
            var result = new Byte[4];
            for (int i = 0; i < 4; ++i) {
                result[i] = (Byte)(ip[i] & mask[i]);
            }

            return new IPAddress(result);
        }
    }
}

Обратите внимание, что в одной сети может быть несколько IP-адресов, что для VPN подключений может быть подмаска 255.255.255.255 (т. Е. Сетевой адрес == IP-адрес) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...