Tôi biết điều này có thể đang đá một con ngựa chết, nhưng có lẽ điều này có thể giúp đỡ ai đó. Tôi đã tìm khắp nơi để tìm cách tìm địa chỉ IP cục bộ của mình, nhưng ở mọi nơi tôi thấy nó đều sử dụng:
Dns.GetHostEntry(Dns.GetHostName());
Tôi hoàn toàn không thích điều này vì nó chỉ nhận được tất cả các địa chỉ được gán cho máy tính của bạn. Nếu bạn có nhiều giao diện mạng (mà hầu như tất cả các máy tính đều làm bây giờ), bạn không biết địa chỉ nào đi với giao diện mạng nào. Sau khi thực hiện một loạt nghiên cứu, tôi đã tạo ra một hàm để sử dụng lớp NetworkInterface và lấy thông tin ra khỏi nó. Bằng cách này tôi có thể biết loại giao diện đó là gì (Ethernet, không dây, loopback, đường hầm, v.v.), cho dù nó có hoạt động hay không, và SOOO nhiều hơn nữa.
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
Bây giờ để có được địa chỉ IPv4 của cuộc gọi giao diện mạng Ethernet của bạn:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Hoặc giao diện Không dây của bạn:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Nếu bạn cố gắng lấy địa chỉ IPv4 cho giao diện không dây, nhưng máy tính của bạn không cài đặt thẻ không dây, nó sẽ chỉ trả về một chuỗi trống. Điều tương tự với giao diện Ethernet.
Hy vọng điều này sẽ giúp được ai đó! :-)
BIÊN TẬP:
Nó đã được chỉ ra (cảm ơn @NasBanov) rằng mặc dù chức năng này giúp trích xuất địa chỉ IP theo cách tốt hơn nhiều so với việc sử dụng Dns.GetHostEntry(Dns.GetHostName())
nó không hỗ trợ rất nhiều giao diện cùng loại hoặc nhiều địa chỉ IP trên một giao diện . Nó sẽ chỉ trả về một địa chỉ IP duy nhất khi có thể có nhiều địa chỉ được gán. Để trả về TẤT CẢ các địa chỉ được gán này, bạn có thể chỉ cần thao tác hàm ban đầu để luôn trả về một mảng thay vì một chuỗi. Ví dụ:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
Bây giờ chức năng này sẽ trả về TẤT CẢ các địa chỉ được gán cho một loại giao diện cụ thể. Bây giờ để chỉ lấy một chuỗi, bạn có thể sử dụng .FirstOrDefault()
tiện ích mở rộng để trả về mục đầu tiên trong mảng hoặc, nếu nó trống, hãy trả về một chuỗi trống.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
Câu nói này có vẻ mâu thuẫn. Bạn đang cố gắng tìm hiểu xem máy tính của bạn có được kết nối với mạng LAN riêng hoặc Internet không?