Какой у меня интернет доступ к IP - PullRequest
4 голосов
/ 11 сентября 2010

На моем компьютере установлены две сетевые карты.Один предназначен для подключения к Интернету, а другой - для доступа в Интернет на клиентских компьютерах.Я получаю свой IP с этим кодом:

IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
foreach (IPAddress ip in HosyEntry.AddressList)
{
    trackingIp = ip.ToString();
    textBox1.Text += trackingIp + ",";
}

Как я могу найти, какой мой IP подключен к интернету (я не хочу делать это с помощью обработки текста)?

Ответы [ 4 ]

4 голосов
/ 11 сентября 2010

Лучший способ получить эту информацию - использовать WMI, эта программа выводит IP-адреса для сетевого адаптера, зарегистрированного для сетевого назначения «0.0.0.0», что для всех целей и задач «не моя сеть»,он же "интернет" (примечание: я не специалист по сетевым технологиям, так что это может быть не совсем правильно).

using System;
using System.Management;

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", 
                "SELECT * FROM Win32_IP4RouteTable WHERE Destination=\"0.0.0.0\"");

            int interfaceIndex = -1;

            foreach (var item in searcher.Get())
            {
                interfaceIndex = Convert.ToInt32(item["InterfaceIndex"]);
            }

            searcher = new ManagementObjectSearcher("root\\CIMV2",
                string.Format("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE InterfaceIndex={0}", interfaceIndex));

            foreach (var item in searcher.Get())
            {
                var ipAddresses = (string[])item["IPAddress"];

                foreach (var ipAddress in ipAddresses)
                {
                    Console.WriteLine(ipAddress);
                }

            }
        }
    }
}
3 голосов
/ 11 сентября 2010

Хорошо. Я написал 2 метода.

Первый способ быстрее, но требует использования сокета. Он пытается подключиться к удаленному хосту, используя каждый локальный IP-адрес.

Второй метод медленнее и не использует сокеты. Он подключается к удаленному хосту (получает ответ, тратит часть трафика) и ищет локальный IP в таблице активных подключений.

Код является черновиком, поэтому проверьте его дважды.

namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.NetworkInformation;
    using System.Net.Sockets;

    class Program
    {
        public static List<IPAddress> GetInternetIPAddressUsingSocket(string internetHostName, int port)
        {
            // get remote host  IP. Will throw SocketExeption on invalid hosts
            IPHostEntry remoteHostEntry = Dns.GetHostEntry(internetHostName);
            IPEndPoint remoteEndpoint = new IPEndPoint(remoteHostEntry.AddressList[0], port);

            // Get all locals IP
            IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());

            var internetIPs = new List<IPAddress>();
            // try to connect using each IP             
            foreach (IPAddress ip in hostEntry.AddressList) {
                IPEndPoint localEndpoint = new IPEndPoint(ip, 80);

                bool endpointIsOK = true;
                try {
                    using (Socket socket = new Socket(localEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) {
                        socket.Connect(remoteEndpoint);
                    }
                }
                catch (Exception) {
                    endpointIsOK = false;
                }

                if (endpointIsOK) {
                    internetIPs.Add(ip); // or you can return first IP that was found as single result.
                }
            }

            return internetIPs;
        }

        public static HashSet <IPAddress> GetInternetIPAddress(string internetHostName)
        {
            // get remote IPs
            IPHostEntry remoteMachineHostEntry = Dns.GetHostEntry(internetHostName);

            var internetIPs = new HashSet<IPAddress>();

            // connect and search for local IP
            WebRequest request = HttpWebRequest.Create("http://" + internetHostName);
            using (WebResponse response = request.GetResponse()) {
                IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
                TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
                response.Close();

                foreach (TcpConnectionInformation t in connections) {
                    if (t.State != TcpState.Established) {
                        continue;
                    }

                    bool isEndpointFound = false;
                    foreach (IPAddress ip in remoteMachineHostEntry.AddressList) {
                        if (ip.Equals(t.RemoteEndPoint.Address)) {
                            isEndpointFound = true;
                            break;
                        }
                    }

                    if (isEndpointFound) {
                        internetIPs.Add(t.LocalEndPoint.Address);
                    }
                }
            }

            return internetIPs;
        }


        static void Main(string[] args)
        {

            List<IPAddress> internetIP = GetInternetIPAddressUsingSocket("google.com", 80);
            foreach (IPAddress ip in internetIP) {
                Console.WriteLine(ip);
            }

            Console.WriteLine("======");

            HashSet<IPAddress> internetIP2 = GetInternetIPAddress("google.com");
            foreach (IPAddress ip in internetIP2) {
                Console.WriteLine(ip);
            }

            Console.WriteLine("Press any key");
            Console.ReadKey(true);
        }
    }
}
2 голосов
/ 11 сентября 2010

Сетевые карты, которые маршрутизируют в Интернет, имеют шлюз. Преимущество этого подхода заключается в том, что вам не нужно выполнять поиск DNS или отказов веб-сервера.

Вот некоторый код, который отображает локальные IP-адреса для сетевого адаптера с допустимым шлюзом:

/// <summary> 
/// This utility function displays all the IP addresses that likely route to the Internet. 
/// </summary> 
public static void DisplayInternetIPAddresses()
{
    var sb = new StringBuilder();

    // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) 
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var network in networkInterfaces)
    {
        // Read the IP configuration for each network 
        var properties = network.GetIPProperties();

        // Only consider those with valid gateways
        var gateways = properties.GatewayAddresses.Select(x => x.Address).Where(
            x => !x.Equals(IPAddress.Any) && !x.Equals(IPAddress.None) && !x.Equals(IPAddress.Loopback) &&
            !x.Equals(IPAddress.IPv6Any) && !x.Equals(IPAddress.IPv6None) && !x.Equals(IPAddress.IPv6Loopback));
        if (gateways.Count() < 1)
            continue;

        // Each network interface may have multiple IP addresses 
        foreach (var address in properties.UnicastAddresses)
        {
            // Comment these next two lines to show IPv6 addresses too
            if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                continue;

            sb.AppendLine(address.Address + " (" + network.Name + ")");
        }
    }

    MessageBox.Show(sb.ToString());
}
1 голос
/ 11 сентября 2010

Вы можете использовать http://www.whatismyip.org/, это возвращает ваш IP.

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