C # uygulamamın üzerinde çalıştığı sunucunun IP adresini nasıl alabilirim?


365

Bir sunucu çalıştırıyorum ve kendi IP adresimi görüntülemek istiyorum.

Bilgisayarın kendi (mümkünse harici) IP adresini almak için sözdizimi nedir?

Birisi aşağıdaki kodu yazdı.

IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
    if (ip.AddressFamily.ToString() == "InterNetwork")
    {
        localIP = ip.ToString();
    }
}
return localIP;

Ancak, genellikle yazara güvensizim ve bu kodu anlamıyorum. Bunu yapmanın daha iyi bir yolu var mı?


1
Harici IP adresi ile ilgili olarak, bunu almak için yerel bir yaklaşım olduğunu düşünmüyorum. Localhost, yerel ağ adreslerini genel adreslere çeviren bir NAT yönlendiricisinin arkasında olabilir. Durumun bu olup olmadığını doğrulamanın (yerel) bir yolu var mı? Bilmiyorum ...
Thiago Arrais

Örnek IP adresi almak için DNS kullanır, DNS yanlış bilgi ile deneyimim oldu. Bu durumda örnek yanlış bilgilerle yanıt verebilir .
leiflundgren

@leiflundgren Ayrıca DNS'de yanlış bilgilere sahip deneyimim oldu. Cevabım, bu durumla karşılaştığımda DNS'ye güvenmeden ihtiyacım olan IP adresini nasıl elde ettiğimi anlatıyor.
Dr.Wily's Apprentice

13
LINQ kullanma:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Luis Perez

2
Bu, tamamen farklı ihtiyaçları olan kullanıcıların aynı soruyu sorma eğiliminde olduğu tipik bir durumdur. Bazı insanlar bilgisayarlarına genel ağdan nasıl ulaşılabileceğini bilmek isterler. Kanonik cevap STUN'dur , ancak birçok kişi rastgele üçüncü taraflara bağımlı korsanlarla cevap verir. Bazı insanlar sadece yerel ağlardaki IP adreslerini bilmek isterler. Bu durumda iyi yanıtlar NetworkInterface.GetAllNetworkInterfaces Metodundan bahseder .
Stéphane Gourichon

Yanıtlar:


237

Hayır, bunu yapmanın en iyi yolu bu. Bir makinenin birkaç IP adresi olabileceğinden , uygun olanı bulmak için bunların koleksiyonunu tekrarlamanız gerekir.

Düzenleme: Değiştirecek tek şey bu değiştirmek olacaktır:

if (ip.AddressFamily.ToString() == "InterNetwork")

buna:

if (ip.AddressFamily == AddressFamily.InterNetwork)

ToStringKarşılaştırma için bir numaralandırmaya gerek yoktur .


3
Mümkünse harici IP adresini istiyorum. Sanırım NAT'ın arkasında olsam bu mümkün olmayacak.
Nefzen

3
Hayır, makineniz yalnızca NAT adresini bilecektir.
Andrew Hare

1
Harici adres için harici bir sunucuya ulaşmanız gerekeceğinden eminim.
Thiago Arrais

29
Ayrıca break, IP'nin koleksiyon yoluyla gereksiz yere yinelemekten kaçındığı tespit edildiğinde de bir açıklama önereceğim (bu durumda performans etkisinin önemli olacağından şüphe ediyorum, ancak genellikle iyi kodlama alışkanlıklarını vurgulamak istiyorum)
Eric J.

7
Bir makinenin birden fazla 'InterNetwork' bağlantı noktasına sahip olması durumunda bunun başarısız olabileceğini unutmayın (Benim durumumda: bir ethernet kartı ve bir sanal makine bağlantı noktası). Geçerli kod, listedeki son IP adresini verecektir.
Christian Studer

168

Genel IP'nizi bilmenin tek yolu, bir başkasından size söylemesini istemektir; bu kod size yardımcı olabilir:

public string GetPublicIP()
{
    String direction = "";
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }

    //Search for the ip in the html
    int first = direction.IndexOf("Address: ") + 9;
    int last = direction.LastIndexOf("</body>");
    direction = direction.Substring(first, last - first);

    return direction;
}

20
Kod örneğinizin Microsoft Academy'de açıklanan Soru 13 Yirmi C # Sorusunda belirtildiğini biliyor musunuz? Sunucu, kodunuzu çaldığı için özür diler. 8:30 dakikadan itibaren. Bkz bu . :)
Erwin Rooijakkers

4
Maalesef bağlantı öldü.
Barry Güvenkaya

Kimsenin görmek istediği durumda yeni bağlantı
Kimmax

1
IP'yi tüm HTML ayrıştırma kodu olmadan doğrudan alabilmeniz için lütfen ipof.in/txt bağlantısını kullanın
vivekv

82

Daha temiz ve hepsi bir arada çözüm: D

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

3
Bu kodla ilgili sorunlar: * Bir bilgisayarın yalnızca tek bir IP adresi olduğunu varsayar. Birçoğunun katları vardır. * Yalnızca IPV4 adreslerini dikkate alır. IPV6'yı eklemek için InterNetworkV6 ekleyin.
Robert Bratton

1
@RobertBratton, Tekrar oynattığınız için teşekkür ederim. Sorun çoklu bir IP adresi veya IPV6 varsaymadı, bu kodda küçük değişiklikler yapılarak belirli farklı sorunları çözebilir.
Muhammed A. Fadil

50

IP adresinizi bir DNS sunucusundan (bana olan) almaya güvenemiyorsanız, aşağıdaki yaklaşımı kullanabilirsiniz:

System.Net.NetworkInformation ad alanı, statik bir GetAllNetworkInterfaces yöntemine sahip bir NetworkInterface sınıfı içerir .

Bu yöntem, makinenizdeki tüm "ağ arabirimlerini" döndürür ve makinenize yalnızca bir kablosuz bağdaştırıcınız ve / veya bir ethernet bağdaştırıcısı donanımınız takılı olsa bile genellikle birkaç tane vardır. Büyük olasılıkla yalnızca bir tane istemenize rağmen, bu ağ arabirimlerinin tümü yerel makineniz için geçerli IP adreslerine sahiptir.

Bir IP adresi arıyorsanız, doğru adresi belirleyene kadar listeyi filtrelemeniz gerekir. Muhtemelen bazı deneyler yapmanız gerekecek, ancak aşağıdaki yaklaşımla başarılı oldum:

  • Kontrol ederek etkin olmayan tüm NetworkInterfaces filtrelerini kaldırın OperationalStatus == OperationalStatus.Up. Bu, örneğin, takılı bir ağ kablonuz yoksa, fiziksel ethernet adaptörünüzü hariç tutacaktır.

Her NetworkInterface için, GetIPProperties yöntemini kullanarak bir IPInterfaceProperties nesnesi alabilirsiniz ve bir IPInterfaceProperties nesnesinden UnicastIPAddressInformation nesnelerinin bir listesi için UnicastAddresses özelliğine erişebilirsiniz .

  • Tercih edilmeyen tek noktaya yayın adreslerini kontrol ederek filtreleyin DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • "Sanal" adresleri işaretleyerek filtreleyin AddressPreferredLifetime != UInt32.MaxValue.

Bu noktada, tüm bu filtrelerle eşleşen ilk (varsa) tek noktaya yayın adresinin adresini alırım.

DÜZENLE:

[yinelenen adres algılama durumu ve tercih edilen kullanım ömrü için yukarıdaki metinde belirtilen koşulları içerecek şekilde 16 Mayıs 2018'de revize edilmiş kod]

Aşağıdaki örnek, geri döngü adresi (127.0.0.1), yinelenen adres algılama durumu ve tercih edilen kullanım ömrü dışında işletim durumuna, adres ailesine göre filtrelemeyi gösterir.

static IEnumerable<IPAddress> GetLocalIpAddresses()
{
    // Get the list of network interfaces for the local computer.
    var adapters = NetworkInterface.GetAllNetworkInterfaces();

    // Return the list of local IPv4 addresses excluding the local
    // host, disconnected, and virtual addresses.
    return (from adapter in adapters
            let properties = adapter.GetIPProperties()
            from address in properties.UnicastAddresses
            where adapter.OperationalStatus == OperationalStatus.Up &&
                  address.Address.AddressFamily == AddressFamily.InterNetwork &&
                  !address.Equals(IPAddress.Loopback) &&
                  address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
                  address.AddressPreferredLifetime != UInt32.MaxValue
            select address.Address);
}

2
Bu özel durumda, OP harici IP adresini görmek istedi, bu nedenle DNS çözümü muhtemelen gidilecek yol. Ancak yerel IP adreslerini yinelemek için tavsiye ettiğim yaklaşım budur.
Matt Davis

3
DNS'nin IP adresini almanın daha kolay bir yolu olduğunu kabul etti. Cevabımda, DNS'nizin güvenilmez olduğu durumlarda bu yaklaşımın işe yaradığını belirtmiştim. Bunu, bir makineyi bir ethernet bağlantı noktasından diğerine taşıdıysanız, DNS hala eski IP adresini bildirecek şekilde DNS'nin dağıtıldığı bir ortamda kullandım, bu yüzden benim amacım için neredeyse işe yaramazdı.
Dr.Wily's Apprentice

Tüm açıklamayı takdir ediyorum, ancak kod örneğini de göndermeliydiniz.
Aidin

Mükemmel teşekkürler. Son Windows güncellemesinin ardından UnicastAddresses olduğunu unutmayın. İlk varsayım artık geçerli değil. Şimdi kontrol etmeniz gerekir tüm kullanılarak ileri filtreleme ile her bağdaştırıcı için UnicastAddress AddressPreferredLifetime ve DuplicateAddressDetectionStation (yukarıdaki metinde belirtilen)
user3085342

37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");

ifconfig.me/ip artık çalışmıyor. Bunun yerine api.ipify.org'u veya Doug'un yorumundaki bağlantıyı deneyin
Kenny83

16
using System.Net;

string host = Dns.GetHostName();
IPHostEntry ip = Dns.GetHostEntry(host);
Console.WriteLine(ip.AddressList[0].ToString());

Bunu makinemde test ettim ve işe yarıyor.


3
u yerel ip alacak ve soru dış IP ieIp hangi internet göz atın ..
Sangram Nandkhile

15

DNS kullanmaktan kaçınmak istiyorsanız:

List<IPAddress> ipList = new List<IPAddress>();
foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (var address in netInterface.GetIPProperties().UnicastAddresses)
    {
        if (address.Address.AddressFamily == AddressFamily.InterNetwork)
        {
            Console.WriteLine("found IP " + address.Address.ToString());
            ipList.Add(address.Address);
        }
    }
}

9

Her zaman InterNetwork'e güvenmeyin çünkü IP4'ü kullanan birden fazla cihaza sahip olabilirsiniz. Şimdi, isterseniz bunu kopyalayabilir ve lütfen inceleyebilir veya uygun gördüğünüz şekilde güncelleyebilirsiniz.

İlk önce yönlendiricinin adresini (ağ geçidi) alıyorum Bir ağ geçidine bağlandığım geri gelirse (bu, doğrudan modeme kablosuz bağlanmadığı ya da doğrudan bağlanmadığı anlamına gelir) o zaman IPAddress olarak ağ geçidi adresimiz var, aksi takdirde boş bir işaretçi IPAdresi referansı var .

Sonra bilgisayarın IPAdresleri listesini almamız gerekiyor. Burada işler zor değil çünkü yönlendiriciler (tüm yönlendiriciler) 4 bayt (...) kullanıyor. İlk üç en önemlisidir, çünkü ona bağlı herhangi bir bilgisayar ilk üç baytla eşleşen IP4 adresine sahip olacaktır. Örn: 192.168.0.1, yönetici tarafından değiştirilmedikçe yönlendirici varsayılan IP'si için standarttır. '192.168.0' veya ne olursa olsun, eşleşmemiz gereken şey budur. IsAddressOfGateway işlevinde yaptığım şey bu. Uzunluk eşleşmesinin nedeni, tüm adreslerin (yalnızca bilgisayar için olan) 4 bayt uzunluğuna sahip olmamasıdır. Cmd'de netstat yazarsanız, bunun doğru olduğunu görürsünüz. İşte burada. Evet, aradığınızı gerçekten elde etmek biraz daha fazla iş gerektiriyor. Eleme süreci. Tanrı aşkına, adresi ping atarak bulamayın, bu zaman alır, çünkü önce pinglenecek adresi gönderiyorsunuz ve ardından sonucu geri göndermesi gerekiyor. Hayır, doğrudan sistem ortamınızla ilgilenen .Net sınıflarıyla çalışın ve yalnızca bilgisayarınız ile ilgili olduğunda aradığınız cevapları alacaksınız.

Şimdi modeminize doğrudan bağlıysanız, işlem neredeyse aynıdır, çünkü modem ağ geçidinizdir, ancak alt maske aynı değildir, çünkü bilgileri modem aracılığıyla doğrudan DNS Sunucunuzdan alıp sunucuya hizmet veren yönlendirici tarafından maskelenmezsiniz. İnternet size yine de aynı kodu kullanabilmenize rağmen, modeme atanan IP'nin son baytı 1'dir. Dolayısıyla, modeme gönderilen IP 111.111.111.1 'ise, 111.111.111 alırsınız. bayt değeri). Ağ geçidi bilgilerini bulmamız gerektiğine dikkat edin, çünkü internet bağlantısıyla ilgilenen yönlendiricinizden ve modeminizden daha fazla cihaz vardır.

Şimdi yönlendiricinizin ilk iki bayt 192 ve 168'i neden değiştirmediğinizi görüyorsunuz. Bunlar yalnızca yönlendiriciler için kesin olarak ayrılmıştır ve internet kullanımı için değil veya IP Protokolü ve bilgisayarınızı pingle sonuçlayan çift ping ile ilgili ciddi bir sorunumuz olacaktır. Atanan yönlendirici IP'nizin 192.168.44.103 olduğu ve bu IP'ye sahip bir siteye tıkladığınız görüntü. AMAN TANRIM! Bilgisayarınız ne ping yapacağınızı bilemez. Tam çarpışma. Bu sorunu önlemek için, internet kullanımı için değil, yalnızca yönlendiriciler atanır. Bu yüzden yönlendiricinin ilk iki baytını yalnız bırakın.

static IPAddress FindLanAddress()
{
    IPAddress gateway = FindGetGatewayAddress();
    if (gateway == null)
        return null;

    IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress address in pIPAddress)            {
        if (IsAddressOfGateway(address, gateway))
                return address;
    return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
    if (address != null && gateway != null)
        return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
    return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
    if (address != null && gateway != null)
    {
        int gwLen = gateway.Length;
        if (gwLen > 0)
        {
            if (address.Length == gateway.Length)
            {
                --gwLen;
                int counter = 0;
                for (int i = 0; i < gwLen; i++)
                {
                    if (address[i] == gateway[i])
                        ++counter;
                }
                return (counter == gwLen);
            }
        }
    }
    return false;

}
static IPAddress FindGetGatewayAddress()
{
    IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();

    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipInfProps = ni.GetIPProperties();
        foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
            return gi.Address;
    }
    return null;
}

1
Bu mantıklı değil: foreach (ipInfProps.GatewayAddresses içinde GatewayIPAddressInformation gi) return gi.Address;
Edwin Evans

3
"Bir ağ geçidine bağlı herhangi bir bilgisayarın ilk üç baytla eşleşen IP4 adresine sahip olacağının" garantisi yoktur. Çeşitli bit kombinasyonları içerebilen alt ağ maskesine bağlıdır. Ayrıca, başlangıç ​​baytlarının burada açıklandığı gibi "192.168" olması gerekmez . Bu kod yalnızca alt ağ maskesi olduğunda çalışır 255.255.255.0ve bunu oldukça karmaşık bir şekilde IMO yapar.
Groo

8

Sadece kendi, bir astarımı ekleyeceğimi düşündüm (daha önce başka birçok yararlı cevap olmasına rağmen).


string ipAddress = new WebClient().DownloadString("http://icanhazip.com");


4
Bunun olası bir bellek sızıntısı olduğunu unutmayın. WebClient uygun şekilde atılmamıştır. Bunun yerine, şunu kullanın: using (var client = new WebClient ()) {return client.DownloadString (" icanhazip.com /"). Trim () ; }
FOO

4

Geçerli genel IP adresini almak için tek yapmanız gereken sayfa yükleme olayında aşağıdaki satırı içeren bir ASPX sayfası oluşturmaktır:

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());

4

İntranet'te çalışıyorsanız, yerel makine IP adresini alabilir ve bu durumda harici ip adresi alırsınız: Web:

//this will bring the IP for the current machine on browser
System.Web.HttpContext.Current.Request.UserHostAddress

Masaüstü:

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());

3
namespace NKUtilities 
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    public class DNSUtility
    {
        public static int Main(string [] args)
        {
            string strHostName = "";
            try {

                if(args.Length == 0)
                {
                    // Getting Ip address of local machine...
                    // First get the host name of local machine.
                    strHostName = Dns.GetHostName();
                    Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
                }
                else
                {
                    // Otherwise, get the IP address of the host provided on the command line.
                    strHostName = args[0];
                }

                // Then using 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());
                }
                return 0;

            } 
            catch(SocketException se) 
            {
                Console.WriteLine("{0} ({1})", se.Message, strHostName);
                return -1;
            } 
            catch(Exception ex) 
            {
                Console.WriteLine("Error: {0}.", ex.Message);
                return -1;
            }
        }
    }
}

Buraya bak detaylar için.

Bilgisayarınızın birden fazla IP'ye sahip olabileceğini hatırlamanız gerekir (aslında her zaman olur) - böylece hangisinin peşindesiniz.


2

Bunu dene:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();

1
Bu, biri IPv4 adresi olan bir dizi yerel IP adresi döndürür, ancak listede doğru olanı bulmak zordur.
Contango

1

Belki harici IP ile bunu (bir Web sunucusu bağlamındaysanız) kullanabilirsiniz.

Request.ServerVariables["LOCAL_ADDR"];

Seninle aynı soruyu soruyordum ve bu stackoverflow makalesinde buldum .

Benim için çalıştı.


1
namespace NKUtilities 
{
    using System;
    using System.Net;

    public class DNSUtility
    {
        public static int Main (string [] args)
        {

          String strHostName = new String ("");
          if (args.Length == 0)
          {
              // Getting Ip address of local machine...
              // First get the host name of local machine.
              strHostName = Dns.GetHostName ();
              Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
          }
          else
          {
              strHostName = args[0];
          }

          // Then using host name, get the IP address list..
          IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
          IPAddress [] addr = ipEntry.AddressList;

          for (int i = 0; i < addr.Length; i++)
          {
              Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
          }
          return 0;
        }    
     }
}

1
using System;
using System.Net;

namespace IPADDRESS
{
    class Program
    {
        static void Main(string[] args)
        {
            String strHostName = string.Empty;
            if (args.Length == 0)
            {                
                /* First get the host name of local machine.*/
                strHostName = Dns.GetHostName();
                Console.WriteLine("Local Machine's Host Name: " + strHostName);
            }
            else
            {
                strHostName = args[0];
            }
            /* Then using host name, get the IP address list..*/
            IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
            IPAddress[] addr = ipEntry.AddressList;
            for (int i = 0; i < addr.Length; i++)
            {
                Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
            }
            Console.ReadLine();
        }
    }
}

1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

İlk dahili IPV4 adresini döndüren basit bir kod satırı veya yok ise null. Yukarıda bir yorum olarak eklendi, ancak birileri için yararlı olabilir (yukarıdaki bazı çözümler daha fazla filtreleme gerektiren birden fazla adres döndürecektir).

Ben de null yerine geri döngü geri dönmek kolaydır sanırım:

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );

1
Nasıl IPAddress.Loopback? :)
CodeTherapist

1

IP adresi listesini bulmak için bu çözümü kullandım

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();
}

Ancak yerel geçerli IP adresi almak için şahsen aşağıdaki çözümü beğendim

public static IPAddress GetIPAddress(string hostName)
{
    Ping ping = new Ping();
    var replay = ping.Send(hostName);

    if (replay.Status == IPStatus.Success)
    {
        return replay.Address;
    }
    return null;
 }

public static void Main()
{
    Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName()));
    Console.WriteLine("Google IP:" + GetIPAddress("google.com");
    Console.ReadLine();
}

1

LINQ çözümü:

Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(ip => ip.ToString()).FirstOrDefault() ?? ""

1

İşte nasıl çözdüm. birkaç fiziksel arabirimleriniz varsa biliyorum, bu tam olarak istediğiniz eth seçin olmayabilir.

private string FetchIP()
{
    //Get all IP registered
    List<string> IPList = new List<string>();
    IPHostEntry host;
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            IPList.Add(ip.ToString());
        }
    }

    //Find the first IP which is not only local
    foreach (string a in IPList)
    {
        Ping p = new Ping();
        string[] b = a.Split('.');
        string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1";
        PingReply t = p.Send(ip2);
        p.Dispose();
        if (t.Status == IPStatus.Success && ip2 != a)
        {
            return a;
        }
    }
    return null;
}


1

LINQ kullanarak tüm IP adreslerini dize olarak alın:

using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
...
string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork)
        .Select(d=>d.Address.ToString())
    ).ToArray();

ÖZEL SÖZLERİ FİLTRELEME ...

İlk olarak, bir uzantı yöntemi tanımlayın IsPrivate():

public static class IPAddressExtensions
{
    // Collection of private CIDRs (IpAddress/Mask) 
    private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}
        .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress
                                    .Parse(c.Split('/')[0]).GetAddressBytes(), 0)
                              , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1])))))
        .ToArray();
    public static bool IsPrivate(this IPAddress ipAddress)
    {
        int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0);
        return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2));           
    }
}

... Ve sonra özel IP'leri filtrelemek için kullanın:

string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork
            && !d.Address.IsPrivate() // Filter out private ones
        )
        .Select(d=>d.Address.ToString())
    ).ToArray();

1

Benim için çalışıyor ... ve çoğu durumda (hepsi değilse de) bir DNS sunucusunu sorgulamaktan daha hızlı olmalıdır. Wily's Apprentice ( burada ) sayesinde.

// ************************************************************************
/// <summary>
/// Will search for the an active NetworkInterafce that has a Gateway, otherwise
/// it will fallback to try from the DNS which is not safe.
/// </summary>
/// <returns></returns>
public static NetworkInterface GetMainNetworkInterface()
{
    List<NetworkInterface> candidates = new List<NetworkInterface>();

    if (NetworkInterface.GetIsNetworkAvailable())
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (
            NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
                candidates.Add(ni);
        }
    }

    if (candidates.Count == 1)
    {
        return candidates[0];
    }

    // Accoring to our tech, the main NetworkInterface should have a Gateway 
    // and it should be the ony one with a gateway.
    if (candidates.Count > 1)
    {
        for (int n = candidates.Count - 1; n >= 0; n--)
        {
            if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
            {
                candidates.RemoveAt(n);
            }
        }

        if (candidates.Count == 1)
        {
            return candidates[0];
        }
    }

    // Fallback to try by getting my ipAdress from the dns
    IPAddress myMainIpAdress = null;
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
        {
            myMainIpAdress = ip;
            break;
        }
    }

    if (myMainIpAdress != null)
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.Address.Equals(myMainIpAdress))
                    {
                        return ni;
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// AddressFamily.InterNetwork = IPv4
/// Thanks to Dr. Wilys Apprentice at
/// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
/// using System.Net.NetworkInformation;
/// </summary>
/// <param name="mac"></param>
/// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
/// <returns></returns>
public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
{
    NetworkInterface[] NetworkInterfaces =
        NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface ni in NetworkInterfaces)
    {
        if (ni.GetPhysicalAddress().Equals(mac))
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                    {
                        if (ai.Address.AddressFamily == addressFamily)
                        {
                            return ai.Address;
                        }
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
/// '?.ToString() ?? ""' on the result.
/// </summary>
/// <returns></returns>
public static IPAddress GetMyInternetIpAddress()
{
    NetworkInterface ni = GetMainNetworkInterface();
    IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
    if (ipAddress == null) // could it be possible ?
    {
        ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
    }

    return ipAddress;
}

// ******************************************************************

Referans olarak bu tam sınıf kodu ben tanımlanmış nerede:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace TcpMonitor
{
    /*
        Usage:
                var cons = TcpHelper.GetAllTCPConnections();
                foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ...
    */

    public class NetHelper
    {
        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0);

        public enum UDP_TABLE_CLASS
        {
            UDP_TABLE_BASIC,
            UDP_TABLE_OWNER_PID,
            UDP_TABLE_OWNER_MODULE
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPROW_OWNER_PID
        {
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;
            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, localScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections()
        {
            return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET);
        }

        public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections()
        {
            return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
            IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(udpTablePtr);
            }

            return result;
        }

        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0);



        public enum MIB_TCP_STATE
        {
            MIB_TCP_STATE_CLOSED = 1,
            MIB_TCP_STATE_LISTEN = 2,
            MIB_TCP_STATE_SYN_SENT = 3,
            MIB_TCP_STATE_SYN_RCVD = 4,
            MIB_TCP_STATE_ESTAB = 5,
            MIB_TCP_STATE_FIN_WAIT1 = 6,
            MIB_TCP_STATE_FIN_WAIT2 = 7,
            MIB_TCP_STATE_CLOSE_WAIT = 8,
            MIB_TCP_STATE_CLOSING = 9,
            MIB_TCP_STATE_LAST_ACK = 10,
            MIB_TCP_STATE_TIME_WAIT = 11,
            MIB_TCP_STATE_DELETE_TCB = 12
        }

        public enum TCP_TABLE_CLASS
        {
            TCP_TABLE_BASIC_LISTENER,
            TCP_TABLE_BASIC_CONNECTIONS,
            TCP_TABLE_BASIC_ALL,
            TCP_TABLE_OWNER_PID_LISTENER,
            TCP_TABLE_OWNER_PID_CONNECTIONS,
            TCP_TABLE_OWNER_PID_ALL,
            TCP_TABLE_OWNER_MODULE_LISTENER,
            TCP_TABLE_OWNER_MODULE_CONNECTIONS,
            TCP_TABLE_OWNER_MODULE_ALL
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPROW_OWNER_PID
        {
            public uint state;
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint remoteAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0);
                }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr); }
            }

            public ushort RemotePort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0);
                }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] remoteAddr;
            public uint remoteScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint state;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public long LocalScopeId
            {
                get { return localScopeId; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, LocalScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }

            public long RemoteScopeId
            {
                get { return remoteScopeId; }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr, RemoteScopeId); }
            }

            public ushort RemotePort
            {
                get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork
        public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

        public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync()
        {
            return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET));
        }

        public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()
        {
            return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);
        }

        public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync()
        {
            return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6));
        }

        public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()
        {
            return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
            IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(tcpTablePtr);
            }

            return result;
        }

        public static string GetTcpStateName(MIB_TCP_STATE state)
        {
            switch (state)
            {
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED:
                    return "Closed";
                case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN:
                    return "Listen";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT:
                    return "SynSent";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD:
                    return "SynReceived";
                case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB:
                    return "Established";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1:
                    return "FinWait 1";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2:
                    return "FinWait 2";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT:
                    return "CloseWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING:
                    return "Closing";
                case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK:
                    return "LastAck";
                case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT:
                    return "TimeWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB:
                    return "DeleteTCB";
                default:
                    return ((int)state).ToString();
            }
        }

        private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>();

        public const string UnknownHostName = "Unknown";

        // ******************************************************************
        public static string GetHostName(IPAddress ipAddress)
        {
            return GetHostName(ipAddress.ToString());
        }

        // ******************************************************************
        public static string GetHostName(string ipAddress)
        {
            string hostName = null;

            if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName))
            {
                try
                {
                    if (ipAddress == "0.0.0.0" || ipAddress == "::")
                    {
                        hostName = ipAddress;
                    }
                    else
                    {
                        hostName = Dns.GetHostEntry(ipAddress).HostName;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    hostName = UnknownHostName;
                }

                DicOfIpToHostName[ipAddress] = hostName;
            }

            return hostName;
        }

        // ************************************************************************
        /// <summary>
        /// Will search for the an active NetworkInterafce that has a Gateway, otherwise
        /// it will fallback to try from the DNS which is not safe.
        /// </summary>
        /// <returns></returns>
        public static NetworkInterface GetMainNetworkInterface()
        {
            List<NetworkInterface> candidates = new List<NetworkInterface>();

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (
                    NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                        candidates.Add(ni);
                }
            }

            if (candidates.Count == 1)
            {
                return candidates[0];
            }

            // Accoring to our tech, the main NetworkInterface should have a Gateway 
            // and it should be the ony one with a gateway.
            if (candidates.Count > 1)
            {
                for (int n = candidates.Count - 1; n >= 0; n--)
                {
                    if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
                    {
                        candidates.RemoveAt(n);
                    }
                }

                if (candidates.Count == 1)
                {
                    return candidates[0];
                }
            }

            // Fallback to try by getting my ipAdress from the dns
            IPAddress myMainIpAdress = null;
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
                {
                    myMainIpAdress = ip;
                    break;
                }
            }

            if (myMainIpAdress != null)
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.Address.Equals(myMainIpAdress))
                            {
                                return ni;
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// AddressFamily.InterNetwork = IPv4
        /// Thanks to Dr. Wilys Apprentice at
        /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
        /// using System.Net.NetworkInformation;
        /// </summary>
        /// <param name="mac"></param>
        /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
        /// <returns></returns>
        public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
        {
            NetworkInterface[] NetworkInterfaces =
                NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface ni in NetworkInterfaces)
            {
                if (ni.GetPhysicalAddress().Equals(mac))
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                            {
                                if (ai.Address.AddressFamily == addressFamily)
                                {
                                    return ai.Address;
                                }
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
        /// '?.ToString() ?? ""' on the result.
        /// </summary>
        /// <returns></returns>
        public static IPAddress GetMyInternetIpAddress()
        {
            NetworkInterface ni = GetMainNetworkInterface();
            IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
            if (ipAddress == null) // could it be possible ?
            {
                ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
            }

            return ipAddress;
        }

        // ******************************************************************
        public static bool IsBroadcastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.GetAddressBytes()[3] == 255;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return false; // NO broadcast in IPv6
            }

            return false;
        }

        // ******************************************************************
        public static bool IsMulticastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx
                return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return ipAddress.IsIPv6Multicast;
            }

            return false;
        }

        // ******************************************************************

    }
}

1

Genel IP adresinizi almanın başka bir yolu da OpenDNS resolve1.opendns.comsunucusunumyip.opendns.com istek olarak .

Komut satırında bu:

  nslookup myip.opendns.com resolver1.opendns.com

Veya C # 'da DNSClient nuget kullanarak:

  var lookup = new LookupClient(new IPAddress(new byte[] { 208, 67, 222, 222 }));
  var result = lookup.Query("myip.opendns.com", QueryType.ANY);

Bu, http uç noktalarına vurmak ve yanıtları ayrıştırmaktan biraz daha temizdir.


0

Ve bu, tüm yerel IP'leri VB.NET'te csv biçiminde elde etmektir

Imports System.Net
Imports System.Net.Sockets

Function GetIPAddress() As String
    Dim ipList As List(Of String) = New List(Of String)
    Dim host As IPHostEntry
    Dim localIP As String = "?"
    host = Dns.GetHostEntry(Dns.GetHostName())
    For Each ip As IPAddress In host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            localIP = ip.ToString()
            ipList.Add(localIP)
        End If
    Next
    Dim ret As String = String.Join(",", ipList.ToArray)
    Return ret
End Function

0

Uzak ip adresini almak için mümkün olan en hızlı yol. Bir indirici kullanmanız veya bilgisayarınızda bir sunucu oluşturmanız gerekir.

Bu basit kodu kullanmanın dezavantajları: (önerilir) Uzak IP Adresinizi almanız 3-5 saniye sürecektir, çünkü başlatıldığında WebClient'in proxy ayarlarınızı kontrol etmesi her zaman 3-5 saniye sürer.

 public static string GetIP()
 {
            string externalIP = "";
            externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                           .Matches(externalIP)[0].ToString();
            return externalIP;
 }

İşte bunu nasıl düzelttim .. (ilk kez hala 3-5 saniye sürer), ancak bundan sonra bağlantınıza bağlı olarak Uzak IP Adresinizi her zaman 0-2 saniye içinde alacaktır.

public static WebClient webclient = new WebClient();
public static string GetIP()
{
    string externalIP = "";
    externalIP = webclient.DownloadString("http://checkip.dyndns.org/");
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                   .Matches(externalIP)[0].ToString();
    return externalIP;
}

Neden inişli çıkışlı? Bundan daha hızlı veya daha iyi bir cevap bulamazsınız .. WebClient'i her seferinde başlatmak büyük bir genel gecikme yaşar.
SSpoke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.