Bagaimana cara mendapatkan alamat IP server tempat aplikasi C # saya berjalan?

365

Saya menjalankan server, dan saya ingin menampilkan alamat IP saya sendiri.

Apa sintaks untuk mendapatkan alamat IP komputer sendiri (jika mungkin, eksternal)?

Seseorang menulis kode berikut.

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;

Namun, saya umumnya tidak percaya pada penulis, dan saya tidak mengerti kode ini. Apakah ada cara yang lebih baik untuk melakukannya?

Nefzen
sumber
1
Mengenai alamat IP eksternal, saya tidak berpikir ada pendekatan lokal untuk mengambil itu. Host lokal mungkin berada di belakang router NAT yang menerjemahkan alamat jaringan lokal ke alamat publik. Apakah ada cara (lokal) untuk memverifikasi jika itu masalahnya? Saya tidak tahu apa-apa ...
Thiago Arrais
Sampel menggunakan DNS untuk mendapatkan alamat IP, saya memiliki pengalaman dengan DNS memiliki informasi yang salah. Untuk kasus itu sampel dapat merespons dengan informasi yang salah .
leiflundgren
@leiflundgren Saya juga punya pengalaman dengan DNS memiliki informasi yang salah. Jawaban saya menjelaskan bagaimana saya mendapatkan alamat IP yang saya butuhkan tanpa mengandalkan DNS ketika saya menghadapi situasi itu.
Apprentice Dr. Wily
13
Menggunakan LINQ:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Luis Perez
2
Ini adalah situasi umum di mana pengguna dengan kebutuhan yang sangat berbeda cenderung mengajukan pertanyaan yang sama. Beberapa orang ingin tahu bagaimana komputer mereka dapat dijangkau dari jaringan publik. Jawaban kanonik adalah STUN , meskipun banyak jawaban dengan peretasan bergantung pada pihak ketiga acak. Beberapa orang hanya ingin mengetahui alamat IP mereka di jaringan lokal. Jawaban yang baik dalam hal ini menyebutkan NetworkInterface.GetAllNetworkInterfaces Method .
Stéphane Gourichon

Jawaban:

237

Tidak, itu cara terbaik untuk melakukannya. Karena mesin dapat memiliki beberapa alamat IP, Anda perlu mengulang koleksi mereka untuk menemukan yang benar.

Sunting: Satu-satunya hal yang akan saya ubah adalah mengubah ini:

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

untuk ini:

if (ip.AddressFamily == AddressFamily.InterNetwork)

Tidak perlu ToStringpencacahan untuk perbandingan.

Andrew Hare
sumber
3
Saya ingin alamat IP eksternal, jika memungkinkan. Saya kira itu tidak akan mungkin terjadi jika saya berada di belakang NAT.
Nefzen
3
Tidak, mesin Anda hanya akan tahu alamat NAT-nya.
Andrew Hare
1
Saya cukup yakin bahwa Anda perlu menjangkau server eksternal untuk alamat eksternal.
Thiago Arrais
29
Saya juga akan menyarankan breakpernyataan setelah IP ditemukan untuk menghindari iterasi yang tidak perlu melalui koleksi (dalam hal ini saya ragu dampak kinerja akan menjadi masalah, tetapi saya ingin menekankan kebiasaan pengkodean yang umumnya baik)
Eric J.
7
Perhatikan bahwa ini mungkin gagal ketika mesin memiliki beberapa port 'InterNetwork' (Dalam kasus saya: kartu ethernet dan port mesin virtual). Kode saat ini akan memberi Anda IP terakhir dalam daftar.
Christian Studer
168

Satu-satunya cara untuk mengetahui IP publik Anda adalah dengan meminta orang lain untuk memberi tahu Anda; kode ini dapat membantu Anda:

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;
}
Ezgar
sumber
20
Apakah Anda tahu contoh kode Anda disebutkan dalam Pertanyaan 13 Twenty C # Pertanyaan Dijelaskan tentang Microsoft Academy? Presenter meminta maaf karena mencuri kode Anda. Dari 8:30 menit dan seterusnya. Lihat ini . :)
Erwin Rooijakkers
4
Sayangnya tautannya sudah mati.
Barry Guvenkaya
Tautan baru jika ada yang mau melihatnya
Kimmax
1
Silakan gunakan tautan ipof.in/txt sehingga Anda bisa mendapatkan IP secara langsung tanpa semua kode parsing HTML
vivekv
82

Pembersih dan solusi menyeluruh: D

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
Mohammed A. Fadil
sumber
3
Masalah dengan kode ini: * Diasumsikan komputer hanya memiliki satu alamat IP. Banyak yang memiliki banyak. * Ini hanya mempertimbangkan alamat IPV4. Tambahkan InterNetworkV6 untuk memasukkan IPV6.
Robert Bratton
1
@RobertBratton, Terima kasih atas ulanganmu. Masalahnya tidak menganggap alamat IP multi atau IPV6, dengan sedikit modifikasi pada kode ini dapat menangani masalah yang berbeda spesifik.
Mohammed A. Fadil
50

Jika Anda tidak dapat mengandalkan untuk mendapatkan alamat IP Anda dari server DNS (yang telah terjadi pada saya), Anda dapat menggunakan pendekatan berikut:

Namespace System.Net.NetworkInformation berisi kelas NetworkInterface , yang memiliki metode GetAllNetworkInterfaces statis .

Metode ini akan mengembalikan semua "antarmuka jaringan" pada mesin Anda, dan umumnya ada beberapa, bahkan jika Anda hanya memiliki adaptor nirkabel dan / atau perangkat keras adaptor ethernet yang terpasang pada mesin Anda. Semua antarmuka jaringan ini memiliki alamat IP yang valid untuk mesin lokal Anda, meskipun Anda mungkin hanya menginginkannya.

Jika Anda mencari satu alamat IP, maka Anda perlu memfilter daftar itu hingga Anda dapat mengidentifikasi alamat yang benar. Anda mungkin perlu melakukan beberapa eksperimen, tetapi saya berhasil dengan pendekatan berikut:

  • Saring semua NetworkInterfaces yang tidak aktif dengan memeriksa OperationalStatus == OperationalStatus.Up. Ini akan mengecualikan adaptor ethernet fisik Anda, misalnya, jika Anda tidak memiliki kabel jaringan.

Untuk setiap NetworkInterface, Anda bisa mendapatkan objek IPInterfaceProperties menggunakan metode GetIPProperties , dan dari objek IPInterfaceProperties Anda dapat mengakses properti UnicastAddresses untuk daftar objek UnicastIPAddressInformation .

  • Saring alamat unicast yang tidak disukai dengan memeriksa DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • Saring alamat "virtual" dengan memeriksa AddressPreferredLifetime != UInt32.MaxValue.

Pada titik ini saya mengambil alamat dari alamat unicast pertama (jika ada) yang cocok dengan semua filter ini.

EDIT:

[kode revisi pada 16 Mei 2018 untuk memasukkan kondisi yang disebutkan dalam teks di atas untuk keadaan deteksi alamat rangkap dan masa pakai yang disukai]

Sampel di bawah ini menunjukkan penyaringan berdasarkan status operasional, keluarga alamat, tidak termasuk alamat loopback (127.0.0.1), status deteksi alamat duplikat, dan masa pakai yang disukai.

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);
}
Apprentice Dr. Wily
sumber
2
Dalam kasus khusus ini, OP ingin melihat alamat IP eksternalnya, sehingga solusi DNS mungkin adalah cara yang harus ditempuh. Tetapi untuk iterasi alamat IP lokal, ini adalah pendekatan yang saya sarankan.
Matt Davis
3
Setuju bahwa DNS adalah cara yang lebih mudah untuk mendapatkan alamat IP. Saya sebutkan dalam jawaban saya bahwa pendekatan ini berfungsi ketika DNS Anda tidak dapat diandalkan. Saya menggunakan ini di lingkungan di mana DNS kacau sehingga jika Anda memindahkan mesin dari satu port ethernet ke yang lain, DNS masih akan melaporkan alamat IP lama, jadi hampir tidak berguna untuk tujuan saya.
Apprentice Dr. Wily
Saya menghargai semua deskripsinya, tetapi Anda harus memposting contoh kode juga.
Aidin
Terima kasih sangat baik Perhatikan bahwa setelah pembaruan Windows terbaru, UnicastAddresses. Asumsi pertama tidak lagi berlaku. Saya sekarang perlu memeriksa semua UnicastAddress untuk setiap adaptor dengan pemfilteran lebih lanjut menggunakan AddressPreferredLifetime dan DuplicateAddressDetectionStation (disebutkan dalam teks Anda di atas)
user3085342
37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");
James
sumber
ifconfig.me/ip tidak lagi berfungsi. Coba api.ipify.org atau tautan dalam komentar Doug
Kenny83
16
using System.Net;

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

Baru saja menguji ini pada mesin saya dan berhasil.

opedog
sumber
3
itu akan memberi Anda ip lokal, dan pertanyaannya adalah tentang IP eksternal ieIp yang dengannya Anda menjelajah internet ..
Sangram Nandkhile
15

Jika Anda ingin menghindari menggunakan DNS:

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);
        }
    }
}
reza
sumber
9

Jangan mengandalkan InterNetwork sepanjang waktu karena Anda dapat memiliki lebih dari satu perangkat yang juga menggunakan IP4 yang akan mengacaukan hasil dalam mendapatkan IP Anda. Sekarang, jika Anda ingin, Anda dapat menyalin ini dan tinjau atau perbarui sesuai keinginan Anda.

Pertama saya mendapatkan alamat router (gateway). Jika kembali bahwa saya terhubung ke gateway (yang berarti tidak terhubung langsung ke modem nirkabel atau tidak) maka kita memiliki alamat gateway kita sebagai IPAddress. .

Maka kita perlu mendapatkan daftar IPAddresses komputer. Di sinilah segalanya tidak terlalu sulit karena router (semua router) menggunakan 4 byte (...). Tiga yang pertama adalah yang paling penting karena setiap komputer yang terhubung akan memiliki alamat IP4 yang cocok dengan tiga byte pertama. Contoh: 192.168.0.1 adalah standar untuk IP default router kecuali diubah oleh administratornya. '192.168.0' atau apa pun itu, kita perlu menyesuaikannya. Dan itulah yang saya lakukan dalam fungsi IsAddressOfGateway. Alasan untuk pencocokan panjang adalah karena tidak semua alamat (yang hanya untuk komputer) memiliki panjang 4 byte. Jika Anda mengetik netstat di cmd, Anda akan menemukan ini benar. Jadi begitulah. Ya, butuh sedikit lebih banyak pekerjaan untuk benar-benar mendapatkan apa yang Anda cari. Proses eliminasi. Dan demi Tuhan, jangan menemukan alamat dengan melakukan ping yang memerlukan waktu karena pertama-tama Anda mengirim alamat untuk di-ping dan kemudian harus mengirim hasilnya kembali. Tidak, bekerja secara langsung dengan kelas .Net yang berhubungan dengan lingkungan sistem Anda dan Anda akan mendapatkan jawaban yang Anda cari saat itu hanya berkaitan dengan komputer Anda.

Sekarang jika Anda terhubung langsung ke modem Anda, prosesnya hampir sama karena modem adalah gateway Anda tetapi submask tidak sama karena Anda mendapatkan informasi langsung dari Server DNS Anda melalui modem dan tidak ditutupi oleh router yang melayani hingga Internet untuk Anda meskipun Anda masih dapat menggunakan kode yang sama karena byte terakhir dari IP yang ditetapkan untuk modem adalah 1. Jadi jika IP yang dikirim dari modem yang berubah adalah 111.111.111.1 'maka Anda akan mendapatkan 111.111.111. (Beberapa nilai byte). Ingatlah bahwa kami perlu menemukan informasi gateway karena ada lebih banyak perangkat yang berhubungan dengan konektivitas internet daripada router dan modem Anda.

Sekarang Anda tahu mengapa Anda TIDAK mengubah dua byte pertama router Anda 192 dan 168. Ini benar-benar dibedakan hanya untuk router dan tidak menggunakan internet atau kami akan memiliki masalah serius dengan Protokol IP dan ping ganda yang mengakibatkan komputer Anda mogok. Gambar bahwa IP router yang Anda tetapkan adalah 192.168.44.103 dan Anda mengklik situs dengan IP itu juga. OH TUHAN! Komputer Anda tidak akan tahu harus melakukan ping apa. Kecelakaan di sana. Untuk menghindari masalah ini, hanya router yang ditugaskan ini dan bukan untuk penggunaan internet. Jadi biarkan dua byte pertama dari router saja.

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;
}
bvrwoo_3376
sumber
1
Ini tidak masuk akal: foreach (GatewayIPAddressInformation gi di ipInfProps.GatewayAddresses) kembalikan gi.Address;
Edwin Evans
3
Tidak ada jaminan bahwa "komputer mana pun yang terhubung ke gateway akan memiliki alamat IP4 yang cocok dengan tiga byte pertama". Itu tergantung pada subnet mask, yang dapat berisi berbagai kombinasi bit. Dan selanjutnya, byte awal tidak harus "192.168", seperti yang dijelaskan di sini . Kode ini hanya akan berfungsi jika subnet mask adalah 255.255.255.0, dan akan melakukannya dengan cara yang agak rumit IMO.
Groo
8

Saya hanya berpikir bahwa saya akan menambahkan sendiri, satu-liner (walaupun sudah ada banyak jawaban berguna lainnya).


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

bæltazor
sumber
4
Perhatikan bahwa ini memiliki potensi kebocoran memori. WebClient tidak dibuang dengan benar. Sebaliknya, gunakan: using (var client = new WebClient ()) {return client.DownloadString (" icanhazip.com /"). Trim () ; }
FOO
4

Untuk mendapatkan alamat IP publik saat ini, yang perlu Anda lakukan adalah membuat halaman ASPX dengan baris berikut pada acara pemuatan halaman:

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());
mendeteksi alamat IP publik
sumber
4

Jika Anda menjalankan dalam intranet Anda akan bisa mendapatkan alamat IP mesin lokal dan jika tidak Anda akan mendapatkan alamat ip eksternal dengan ini: Web:

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

Desktop:

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
Guilherme Ferreira
sumber
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;
            }
        }
    }
}

Lihat di sini untuk detailnya.

Anda harus ingat komputer Anda dapat memiliki lebih dari satu IP (sebenarnya selalu demikian) - jadi yang mana yang Anda cari.

mfloryan
sumber
2

Coba ini:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();
Topeng
sumber
1
Ini mengembalikan sejumlah alamat IP lokal, salah satunya adalah alamat IPv4, namun sulit untuk menemukan yang benar dalam daftar.
Contango
1

Mungkin dengan IP eksternal Anda dapat mempertimbangkan (jika Anda berada dalam konteks server Web) menggunakan ini

Request.ServerVariables["LOCAL_ADDR"];

Saya mengajukan pertanyaan yang sama seperti Anda dan saya menemukannya di ini artikel stackoverflow.

Ini berhasil untuk saya.

Juan Calero
sumber
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;
        }    
     }
}
naani
sumber
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();
        }
    }
}
sundram
sumber
1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

Satu baris kode sederhana yang mengembalikan alamat IPV4 internal pertama atau nol jika tidak ada. Ditambahkan sebagai komentar di atas, tetapi mungkin bermanfaat bagi seseorang (beberapa solusi di atas akan mengembalikan beberapa alamat yang perlu difilter lebih lanjut).

Ini juga mudah untuk mengembalikan loopback bukan nol Saya kira dengan:

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );
Wolf5370
sumber
1
Bagaimana dengan IPAddress.Loopback? :)
CodeTherapist
1

Untuk menemukan daftar alamat IP saya telah menggunakan solusi ini

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

Tapi saya pribadi suka solusi di bawah ini untuk mendapatkan alamat IP lokal yang valid

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();
}
Ravi Shankar
sumber
1

Solusi LINQ:

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

Inilah cara saya menyelesaikannya. saya tahu jika Anda memiliki beberapa antarmuka fisik ini mungkin tidak memilih et persis yang Anda inginkan.

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;
}
Thomas Andreè Wang
sumber
1

Pertanyaannya tidak mengatakan ASP.NET MVC tapi saya tetap meninggalkan ini di sini:

Request.UserHostAddress
Barry Guvenkaya
sumber
1

Dapatkan semua alamat IP sebagai string menggunakan LINQ:

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

UNTUK MENYARANKAN HAK-HAK PRIBADI ...

Pertama, tentukan metode ekstensi 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));           
    }
}

... Dan kemudian menggunakannya untuk menyaring IP pribadi:

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();
Diego
sumber
1

Ini berfungsi untuk saya ... dan seharusnya lebih cepat dalam banyak kasus (jika tidak semua) daripada meminta server DNS. Terima kasih untuk Apprentice Dr. Wily (di sini ).

// ************************************************************************
/// <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;
}

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

Sama seperti referensi, ini adalah kode kelas lengkap tempat saya mendefinisikannya:

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

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

    }
}
Eric Ouellet
sumber
1

Namun cara lain untuk mendapatkan alamat IP publik Anda adalah dengan menggunakan resolve1.opendns.comserver OpenDNS dengan myip.opendns.comsebagai permintaan.

Di baris perintah ini adalah:

  nslookup myip.opendns.com resolver1.opendns.com

Atau di C # menggunakan nuget DNSClient:

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

Ini sedikit lebih bersih daripada mengenai titik akhir http dan respons parsing.

Ian Mercer
sumber
0

Dan ini untuk mendapatkan semua IP lokal dalam format csv di VB.NET

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
Saurabh Kumar
sumber
0

Untuk mendapatkan alamat ip jarak jauh, cara tercepat mungkin. Anda harus menggunakan pengunduh, atau membuat server di komputer Anda.

Kelemahan untuk menggunakan kode sederhana ini: (yang disarankan) adalah akan memakan waktu 3-5 detik untuk mendapatkan Alamat IP Jarak Jauh Anda karena WebClient ketika diinisialisasi selalu membutuhkan 3-5 detik untuk memeriksa pengaturan proxy Anda.

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

Inilah cara saya memperbaikinya .. (pertama kali masih membutuhkan waktu 3-5 detik) tetapi setelah itu akan selalu mendapatkan Alamat IP Jarak Jauh Anda dalam 0-2 detik tergantung pada koneksi Anda.

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;
}
SSpoke
sumber
Mengapa downvote? Anda tidak dapat menemukan jawaban lebih cepat atau lebih baik daripada ini .. menginisialisasi WebClient setiap kali memiliki penundaan overhead yang besar tidak ada jalan lain.
SSpoke