Làm cách nào để lấy địa chỉ IP của máy chủ mà ứng dụng C # của tôi đang chạy?


365

Tôi đang chạy một máy chủ và tôi muốn hiển thị địa chỉ IP của riêng mình.

Cú pháp để lấy địa chỉ IP của chính máy tính (nếu có thể, bên ngoài) là gì?

Có người viết đoạn mã sau.

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;

Tuy nhiên, tôi thường không tin tưởng tác giả và tôi không hiểu mã này. Có cách nào tốt hơn để làm như vậy?


1
Về địa chỉ IP bên ngoài, tôi không nghĩ có một cách tiếp cận địa phương để truy xuất địa chỉ đó. Localhost có thể đứng sau bộ định tuyến NAT đang dịch địa chỉ mạng cục bộ sang địa chỉ công cộng. Có cách nào (cục bộ) để xác minh nếu đó là trường hợp? Tôi không biết về bất kỳ ...
Thiago Arrais

Mẫu sử dụng DNS để lấy địa chỉ IP, tôi đã có kinh nghiệm với DNS có thông tin sai. Trong trường hợp đó, mẫu có thể phản hồi với thông tin sai .
leiflundgren

@leiflundgren Tôi cũng đã có kinh nghiệm với DNS có thông tin sai. Câu trả lời của tôi mô tả cách tôi có được địa chỉ IP mà tôi cần mà không cần dựa vào DNS khi tôi gặp phải tình huống đó.
Học viên của Tiến sĩ Wily

13
Sử dụng LINQ:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Luis Perez

2
Đây là một tình huống điển hình trong đó người dùng có nhu cầu hoàn toàn khác nhau có xu hướng hỏi cùng một câu hỏi. Một số người muốn biết làm thế nào máy tính của họ có thể được truy cập từ mạng công cộng. Câu trả lời chính tắc là STUN , mặc dù nhiều câu trả lời có hack phụ thuộc vào bên thứ ba ngẫu nhiên. Một số người chỉ muốn biết (các) địa chỉ IP của họ trên (các) mạng cục bộ. Câu trả lời tốt trong trường hợp này đề cập đến Phương thức NetworkInterface.Get ALLNetworkInterfaces .
Stéphane Gourmetichon

Câu trả lời:


237

Không, đó là cách tốt nhất để làm điều đó. Vì một máy có thể có một số địa chỉ IP, bạn cần lặp lại bộ sưu tập của chúng để tìm địa chỉ thích hợp.

Chỉnh sửa: Điều duy nhất tôi sẽ thay đổi là thay đổi điều này:

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

đến đây:

if (ip.AddressFamily == AddressFamily.InterNetwork)

Không cần phải ToStringliệt kê để so sánh.


3
Tôi muốn địa chỉ IP bên ngoài, nếu có thể. Tôi cho rằng sẽ không thể như vậy nếu tôi đứng sau NAT.
Nefzen

3
Không, máy của bạn sẽ chỉ biết địa chỉ NAT của nó.
Andrew Hare

1
Tôi khá chắc chắn rằng bạn sẽ cần phải tiếp cận một máy chủ bên ngoài cho địa chỉ bên ngoài.
Thiago Arrais

29
Tôi cũng sẽ đề xuất một breaktuyên bố sau khi IP được tìm thấy để tránh lặp đi lặp lại một cách không cần thiết thông qua bộ sưu tập (trong trường hợp này tôi nghi ngờ tác động hiệu suất sẽ trở nên quan trọng, nhưng tôi muốn nhấn mạnh thói quen mã hóa nói chung tốt)
Eric J.

7
Lưu ý rằng điều này có thể thất bại khi một máy có nhiều cổng 'InterNetwork' (Trong trường hợp của tôi: thẻ ethernet là cổng máy ảo). Mã hiện tại sẽ cung cấp cho bạn IP cuối cùng trong danh sách.
Christian Studer

168

Cách duy nhất để biết IP công khai của bạn là yêu cầu người khác nói với bạn; mã này có thể giúp bạn:

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
Bạn có biết mẫu mã của bạn đã được đề cập trong Câu hỏi 13 Hai mươi câu hỏi C # Giải thích về Học viện Microsoft? Người trình bày xin lỗi vì đã đánh cắp mã của bạn. Từ 8:30 phút trở đi. Xem này . :)
Erwin Rooijakkers

4
Thật không may liên kết là chết.
Barry Guvenkaya

Liên kết mới trong trường hợp bất kỳ ai muốn xem nó
Kimmax

1
Vui lòng sử dụng liên kết ipof.in/txt để bạn có thể nhận IP trực tiếp mà không cần tất cả mã phân tích HTML
vivekv

82

Sạch hơn và tất cả trong một giải pháp: D

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

3
Các vấn đề với mã này: * Nó giả sử một máy tính chỉ có một địa chỉ IP duy nhất. Nhiều người có nhiều. * Nó chỉ xem xét địa chỉ IPV4. Thêm InterNetworkV6 để bao gồm IPV6.
Robert Bratton

1
@RobertBratton, Cảm ơn bạn đã phát lại. Vấn đề không giả sử địa chỉ IP hoặc IPV6, với một chút sửa đổi mã này, nó có thể xử lý các vấn đề cụ thể khác nhau.
Mohammed A. Fadil

50

Nếu bạn không thể dựa vào việc lấy địa chỉ IP của mình từ máy chủ DNS (điều này đã xảy ra với tôi), bạn có thể sử dụng phương pháp sau:

Không gian tên System.Net.NetworkIn information chứa một lớp NetworkInterface , có một phương thức GetAllNetworkInterfaces tĩnh .

Phương pháp này sẽ trả về tất cả "giao diện mạng" trên máy của bạn và thường có khá nhiều, ngay cả khi bạn chỉ có bộ điều hợp không dây và / hoặc phần cứng bộ điều hợp ethernet được cài đặt trên máy của bạn. Tất cả các giao diện mạng này đều có địa chỉ IP hợp lệ cho máy cục bộ của bạn, mặc dù bạn có thể chỉ muốn một địa chỉ.

Nếu bạn đang tìm kiếm một địa chỉ IP, thì bạn sẽ cần lọc danh sách xuống cho đến khi bạn có thể xác định đúng địa chỉ. Bạn có thể sẽ cần phải thực hiện một số thử nghiệm, nhưng tôi đã thành công với cách tiếp cận sau:

  • Lọc ra mọi NetworkInterfaces không hoạt động bằng cách kiểm tra OperationalStatus == OperationalStatus.Up. Điều này sẽ loại trừ bộ điều hợp ethernet vật lý của bạn, ví dụ, nếu bạn không cắm cáp mạng.

Đối với mỗi NetworkInterface, bạn có thể nhận được một đối tượng IPInterfaceProperIES bằng phương thức GetIPProperIES và từ một đối tượng IPInterfaceProperIES, bạn có thể truy cập vào thuộc tính UnicastAddresses để xem danh sách các đối tượng UnicastIPAddressInform .

  • Lọc ra các địa chỉ unicast không ưa thích bằng cách kiểm tra DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • Lọc địa chỉ "ảo" bằng cách kiểm tra AddressPreferredLifetime != UInt32.MaxValue.

Tại thời điểm này, tôi lấy địa chỉ của địa chỉ unicast đầu tiên (nếu có) phù hợp với tất cả các bộ lọc này.

BIÊN TẬP:

[mã sửa đổi vào ngày 16 tháng 5 năm 2018 để bao gồm các điều kiện được đề cập trong văn bản ở trên cho trạng thái phát hiện địa chỉ trùng lặp và thời gian tồn tại ưa thích]

Mẫu bên dưới thể hiện tính năng lọc dựa trên trạng thái hoạt động, họ địa chỉ, ngoại trừ địa chỉ loopback (127.0.0.1), trạng thái phát hiện địa chỉ trùng lặp và thời gian tồn tại ưa thích.

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
Trong trường hợp cụ thể này, OP muốn xem địa chỉ IP bên ngoài của anh ấy, vì vậy giải pháp DNS có lẽ là cách tốt nhất. Nhưng để lặp lại địa chỉ IP cục bộ, đây là cách tiếp cận tôi khuyên dùng.
Matt Davis

3
Đồng ý rằng DNS là cách dễ dàng hơn để lấy địa chỉ IP. Tôi đã đề cập trong câu trả lời của mình rằng phương pháp này hoạt động khi DNS của bạn không đáng tin cậy. Tôi đã sử dụng điều này trong môi trường mà DNS bị rối đến mức nếu bạn di chuyển máy từ cổng ethernet này sang cổng khác, DNS vẫn sẽ báo cáo địa chỉ IP cũ, vì vậy mục đích của tôi gần như vô dụng.
Học viên của Tiến sĩ Wily

Tôi đánh giá cao tất cả các mô tả, nhưng bạn cũng nên đăng mẫu mã.
Aidin

Cảm ơn vô cùng. Lưu ý rằng sau bản cập nhật Windows gần đây, UnicastAddresses. Giả định đầu tiên không còn giữ. Bây giờ tôi cần phải kiểm tra tất cả các UnicastAddress cho mỗi adapter với lọc hơn nữa sử dụng AddressPreferredLifetimeDuplicateAddressDetectionStation (đề cập trong văn bản của bạn ở trên)
user3085342

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

ifconfig.me/ip không còn hoạt động. Thay vào đó, hãy thử api.ipify.org hoặc liên kết trong nhận xét của Doug
Kenny83

16
using System.Net;

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

Chỉ cần thử nghiệm điều này trên máy của tôi và nó hoạt động.


3
nó sẽ nhận được ip cục bộ của bạn và câu hỏi là về IP bên ngoài tức là bạn duyệt internet ..
Sangram Nandkhile

15

Nếu bạn muốn tránh sử dụng 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);
        }
    }
}

9

Đừng phụ thuộc vào InterNetwork mọi lúc vì bạn có thể có nhiều hơn một thiết bị sử dụng IP4, điều này sẽ làm hỏng kết quả trong việc nhận IP của bạn. Bây giờ, nếu bạn muốn bạn có thể chỉ cần sao chép nó và vui lòng xem lại hoặc cập nhật nó theo cách bạn thấy phù hợp.

Đầu tiên tôi nhận được địa chỉ của bộ định tuyến (cổng) Nếu tôi quay lại rằng tôi được kết nối với một cổng (có nghĩa là không kết nối trực tiếp với modem không dây hay không) thì chúng tôi có địa chỉ cổng là IPAddress khác, chúng tôi tham chiếu IPAddress .

Sau đó, chúng ta cần lấy danh sách IPAddresses của máy tính. Đây là nơi mọi thứ không khó vì các bộ định tuyến (tất cả các bộ định tuyến) sử dụng 4 byte (...). Ba cái đầu tiên là quan trọng nhất bởi vì bất kỳ máy tính nào được kết nối với nó sẽ có địa chỉ IP4 khớp với ba byte đầu tiên. Ví dụ: 192.168.0.1 là tiêu chuẩn cho IP mặc định của bộ định tuyến trừ khi được quản trị viên của nó thay đổi. '192.168.0' hoặc bất cứ điều gì chúng có thể là những gì chúng ta cần phải đối sánh. Và đó là tất cả những gì tôi đã làm trong hàm IsAddressOfGateway. Lý do cho độ dài phù hợp là vì không phải tất cả các địa chỉ (chỉ dành cho máy tính) có độ dài 4 byte. Nếu bạn gõ netstat trong cmd, bạn sẽ thấy điều này là đúng. Vì vậy, có bạn có nó. Vâng, phải mất thêm một chút công việc để thực sự có được những gì bạn đang tìm kiếm. Quá trình đào thải. Và vì Chúa, không tìm thấy địa chỉ bằng cách ping nó mất thời gian vì trước tiên bạn đang gửi địa chỉ để được ping và sau đó nó phải gửi lại kết quả. Không, làm việc trực tiếp với các lớp .Net xử lý môi trường hệ thống của bạn và bạn sẽ nhận được câu trả lời mà bạn đang tìm kiếm khi nó chỉ phải làm với máy tính của bạn.

Bây giờ nếu bạn được kết nối trực tiếp với modem của mình, quá trình này gần như giống nhau vì modem là cổng của bạn nhưng submask không giống nhau vì bạn nhận thông tin trực tiếp từ Máy chủ DNS của mình qua modem và không bị che bởi bộ định tuyến phục vụ Internet cho bạn mặc dù bạn vẫn có thể sử dụng cùng một mã bởi vì byte cuối cùng của IP được gán cho modem là 1. Vì vậy, nếu IP được gửi từ modem thay đổi là 111.111.111.1 'thì bạn sẽ nhận được 111.111.111. giá trị byte). Hãy ghi nhớ rằng chúng tôi cần tìm thông tin cổng vì có nhiều thiết bị xử lý kết nối internet hơn bộ định tuyến và modem của bạn.

Bây giờ bạn sẽ thấy lý do tại sao bạn KHÔNG thay đổi hai byte đầu tiên của bộ định tuyến 192 và 168. Chúng chỉ được phân biệt rõ ràng cho các bộ định tuyến và không sử dụng internet hoặc chúng tôi sẽ gặp vấn đề nghiêm trọng với Giao thức IP và ping kép dẫn đến sự cố máy tính của bạn. Hình ảnh rằng IP bộ định tuyến được chỉ định của bạn là 192.168.44.103 và bạn cũng nhấp vào một trang web có IP đó. CHÚA ƠI! Máy tính của bạn sẽ không biết ping gì. Tai nạn ngay đó. Để tránh vấn đề này, chỉ các bộ định tuyến được gán những thứ này và không sử dụng cho internet. Vì vậy, để lại hai byte đầu tiên của bộ định tuyế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
Điều này không có ý nghĩa: foreach (GatewayIPAddressIn information gi in ipInfProps.GatewayAddresses) return gi.Address;
Edwin Evans

3
Không có gì đảm bảo rằng "bất kỳ máy tính nào được kết nối với một cổng sẽ có địa chỉ IP4 khớp với ba byte đầu tiên". Nó phụ thuộc vào mặt nạ mạng con, có thể chứa các kết hợp bit khác nhau. Và hơn nữa, các byte bắt đầu không phải là "192.168", như được mô tả ở đây . Mã này sẽ chỉ hoạt động nếu mặt nạ mạng con là 255.255.255.0và nó sẽ thực hiện theo cách khá phức tạp IMO.
Groo

8

Tôi chỉ nghĩ rằng tôi sẽ thêm phần riêng của mình (mặc dù đã có nhiều câu trả lời hữu ích khác).


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


4
Lưu ý rằng điều này có một rò rỉ bộ nhớ tiềm năng. WebClient không được xử lý đúng cách. Thay vào đó, hãy sử dụng: bằng cách sử dụng (var client = new WebClient ()) {return client.DoadString (" icanhazip.com /"). Trim () ; }
FOO

4

Để nhận địa chỉ IP công cộng hiện tại, tất cả những gì bạn cần làm là tạo một trang ASPX với dòng sau trong sự kiện tải trang:

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

4

Nếu bạn đang chạy trong mạng nội bộ, bạn sẽ có thể nhận địa chỉ IP của máy cục bộ và nếu không, bạn sẽ nhận được địa chỉ IP bên ngoài bằng: Web:

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

Máy tính để bàn:

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

Nhìn vào đây để biết chi tiết.

Bạn phải nhớ máy tính của bạn có thể có nhiều hơn một IP (thực tế nó luôn luôn như vậy) - vì vậy bạn sẽ theo đuổi cái nào.


2

Thử cái này:

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

1
Điều này trả về một số địa chỉ IP cục bộ, một trong số đó là địa chỉ IPv4, tuy nhiên rất khó tìm được địa chỉ chính xác trong danh sách.
Contango

1

Có thể bằng IP bên ngoài, bạn có thể xem xét (nếu bạn đang ở trong bối cảnh máy chủ Web) bằng cách sử dụng

Request.ServerVariables["LOCAL_ADDR"];

Tôi đã đặt ra câu hỏi tương tự như bạn và tôi tìm thấy nó trong này bài viết stackoverflow.

Nó làm việc cho tôi.


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

Một dòng mã đơn giản trả về địa chỉ IPV4 nội bộ đầu tiên hoặc null nếu không có. Đã thêm dưới dạng nhận xét ở trên, nhưng có thể hữu ích cho ai đó (một số giải pháp ở trên sẽ trả về nhiều địa chỉ cần lọc thêm).

Tôi cũng dễ dàng trả lại loopback thay vì null tôi đoán với:

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

1
Thế còn IPAddress.Loopback? :)
CodeTherapist

1

Để tìm danh sách địa chỉ IP tôi đã sử dụng giải pháp này

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

Nhưng cá nhân tôi thích giải pháp dưới đây để có được địa chỉ IP hợp lệ cục bộ

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

Giải pháp LINQ:

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

1

Đây là cách tôi giải quyết nó. Tôi biết nếu bạn có một vài giao diện vật lý thì điều này có thể không chọn chính xác eth bạn muốn.

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

Câu hỏi không nói ASP.NET MVC nhưng dù sao tôi cũng chỉ để nó ở đây:

Request.UserHostAddress

1

Nhận tất cả các địa chỉ IP dưới dạng chuỗi bằng 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();

ĐỂ LỌC RA MẮT RIÊNG TƯ ...

Đầu tiên, xác định một phương thức mở rộng 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));           
    }
}

... Và sau đó sử dụng nó để lọc IP riêng:

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

Nó hoạt động với tôi ... và sẽ nhanh hơn trong hầu hết các trường hợp (nếu không phải tất cả) so với truy vấn máy chủ DNS. Cảm ơn Thực tập sinh của Tiến sĩ Wily ( tại đây ).

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

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

Cũng như tham chiếu, đây là mã lớp đầy đủ nơi tôi đã định nghĩa nó:

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

Tuy nhiên, một cách khác để có được địa chỉ IP công cộng của bạn là sử dụng resolve1.opendns.commáy chủ của OpenDNS myip.opendns.comtheo yêu cầu.

Trên dòng lệnh này là:

  nslookup myip.opendns.com resolver1.opendns.com

Hoặc trong C # bằng cách sử dụng nuget DNSClient:

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

Đây là một chút sạch hơn so với nhấn điểm cuối http và phản hồi phân tích cú pháp.


0

Và điều này là để có được tất cả các IP cục bộ ở định dạng csv trong 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

0

Để có được địa chỉ IP từ xa một cách nhanh nhất có thể. Bạn phải sử dụng trình tải xuống hoặc tạo máy chủ trên máy tính của mình.

Nhược điểm của việc sử dụng mã đơn giản này: (được khuyến nghị) là sẽ mất 3-5 giây để nhận Địa chỉ IP từ xa vì WebClient khi khởi tạo luôn mất 3-5 giây để kiểm tra cài đặt proxy của bạn.

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

Đây là cách tôi sửa nó .. (lần đầu vẫn mất 3-5 giây) nhưng sau đó nó sẽ luôn nhận được Địa chỉ IP từ xa trong 0-2 giây tùy thuộc vào kết nối của bạn.

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

Tại sao các downvote? bạn không thể tìm thấy câu trả lời nhanh hơn hay tốt hơn thế này .. việc khởi tạo WebClient mọi lúc có độ trễ lớn không có cách nào khác.
SSpoke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.