2008-09-29 43 views

Trả lời

25

Link Nó nói đó, thêm System.net, và sử dụng như sau

//To get the local IP address 
string sHostName = Dns.GetHostName(); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString()); 
} 
+0

Địa chỉ IP nào trong mảng mà bạn lấy lại là đúng? – EBGreen

+6

GetHostByName hiển thị là không dùng nữa. vết thương lên bằng cách sử dụng: IPAddress [] ipAddress = Dns.GetHostAddresses (strHostName); hoàn thành điều tương tự. –

+12

Ngoài ra, ký hiệu Hungary gần như đã chết vào thời điểm này. Sử dụng string hostName. –

11

Như một cỗ máy có thể có nhiều địa chỉ ip, cách chính xác để tìm ra địa chỉ IP của bạn mà bạn sẽ được sử dụng để định tuyến đến internet chung là mở một ổ cắm đến một máy chủ trên internet, sau đó kiểm tra kết nối ổ cắm để xem địa chỉ cục bộ nào đang được sử dụng trong kết nối đó.

Bằng cách kiểm tra kết nối ổ cắm, bạn sẽ có thể xem xét các bảng định tuyến kỳ lạ, nhiều địa chỉ IP và tên máy chủ lưu trữ. Bí quyết với tên máy chủ ở trên có thể hoạt động, nhưng tôi sẽ không coi nó là hoàn toàn đáng tin cậy.

36

Nếu bạn đang tìm kiếm loại thông tin mà tiện ích dòng lệnh, ipconfig, có thể cung cấp, có thể bạn đang sử dụng không gian tên System.Net.NetworkInformation.

Mã mẫu này sẽ liệt kê tất cả các giao diện mạng và đổ các địa chỉ đã biết cho mỗi bộ điều hợp.

using System; 
using System.Net; 
using System.Net.NetworkInformation; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      Console.WriteLine("Network Interface: {0}", netif.Name); 
      IPInterfaceProperties properties = netif.GetIPProperties(); 
      foreach (IPAddress dns in properties.DnsAddresses) 
       Console.WriteLine("\tDNS: {0}", dns); 
      foreach (IPAddressInformation anycast in properties.AnycastAddresses) 
       Console.WriteLine("\tAnyCast: {0}", anycast.Address); 
      foreach (IPAddressInformation multicast in properties.MulticastAddresses) 
       Console.WriteLine("\tMultiCast: {0}", multicast.Address); 
      foreach (IPAddressInformation unicast in properties.UnicastAddresses) 
       Console.WriteLine("\tUniCast: {0}", unicast.Address); 
     } 
    } 
} 

Có lẽ bạn quan tâm nhất đến UnicastAddresses.

24

Sử dụng Dns yêu cầu máy tính của bạn phải được đăng ký với máy chủ DNS cục bộ, điều này không nhất thiết đúng nếu bạn đang sử dụng mạng nội bộ và thậm chí ít khả năng hơn nếu bạn đang ở nhà với ISP. Nó cũng đòi hỏi một mạng vòng - tất cả để tìm hiểu thông tin về máy tính của riêng bạn.

Cách thích hợp:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
foreach(NetworkInterface adapter in nics) 
{ 
    foreach(var x in adapter.GetIPProperties().UnicastAddresses) 
    { 
     if (x.Address.AddressFamily == AddressFamily.InterNetwork && x.IsDnsEligible) 
     { 
        Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString()); 
     } 
    } 
} 

(Cập nhật: 31-Jul-2015: Cố định một số vấn đề với mã)

Hoặc cho những ai muốn chỉ là một dòng của LINQ:

NetworkInterface.GetAllNetworkInterfaces() 
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses) 
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible) 
    .Select (adr => adr.Address.ToString()); 
+0

hey James, ha 'NetworkInformation' từ dòng câu trả lời của bạn no: 2, C# compiler nói" loại hoặc không gian tên không thể tìm thấy ", tôi đã nhập' System.Net.NetworkInformation' sau đó cũng đã nói "loại hoặc không gian tên bị thiếu" , thỏa thuận là gì ? – FosterZ

+1

@FosterZ: Tôi đồng ý (nó không hoạt động như cũ). Tôi đã thực hiện mã này như: 'foreach (NetworkInterface ni in nics) {foreach (UnicastIPAddressInformation x in ni.GetIPProperties(). UnicastAddresses) {if (x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) {Console .WriteLine ("IPAddress ........: {0: x}", x.Address.ToString()); }}} 'và nó in ra một hỗn hợp của hầu hết các địa chỉ IP thực tế của tôi và một số địa chỉ không phải là địa chỉ IP của tôi. – user664939

1

Nếu bạn biết có một hoặc nhiều địa chỉ IPv4 cho máy tính của mình, điều này sẽ cung cấp một trong số chúng:

Dns.GetHostAddresses(Dns.GetHostName()) 
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString() 

GetHostAddresses thường chặn chuỗi cuộc gọi trong khi truy vấn máy chủ DNS và ném SocketException nếu truy vấn không thành công. Tôi không biết liệu nó có bỏ qua cuộc gọi mạng khi tra cứu tên máy chủ của riêng bạn hay không.

Các vấn đề liên quan