ฉันรู้ว่านี่อาจเป็นการเตะม้าที่ตายแล้ว แต่นี่อาจช่วยคนได้ ฉันดูทั่วสถานที่เพื่อหาที่อยู่ IP ในพื้นที่ของฉัน แต่ทุกที่ที่ฉันพบจะบอกว่าให้ใช้:
Dns.GetHostEntry(Dns.GetHostName());
ฉันไม่ชอบสิ่งนี้เลยเพราะเพิ่งได้รับที่อยู่ทั้งหมดที่กำหนดให้กับคอมพิวเตอร์ของคุณ หากคุณมีอินเตอร์เฟซเครือข่ายหลายตัว (ซึ่งคอมพิวเตอร์เกือบทุกเครื่องใช้งานได้แล้ววันนี้) คุณไม่มีความคิดใดว่าที่อยู่จะไปกับอินเทอร์เฟซเครือข่ายใด หลังจากทำการค้นคว้ามากมายฉันได้สร้างฟังก์ชันเพื่อใช้คลาส NetworkInterface และดึงข้อมูลออกมา ด้วยวิธีนี้ฉันสามารถบอกได้ว่ามันเป็นอินเทอร์เฟซประเภทใด (อีเธอร์เน็ตไร้สายลูปแบ็คอุโมงค์ ฯลฯ ) ไม่ว่าจะใช้งานอยู่หรือไม่และ SOOO อื่น ๆ อีกมากมาย
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;
}
ตอนนี้เพื่อรับที่อยู่ IPv4 ของการโทรติดต่อเครือข่าย Ethernet:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
หรืออินเตอร์เฟซไร้สายของคุณ:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
หากคุณพยายามรับที่อยู่ IPv4 สำหรับอินเทอร์เฟซแบบไร้สาย แต่คอมพิวเตอร์ของคุณไม่มีการ์ดไร้สายติดตั้งอยู่ก็จะส่งคืนสตริงว่างเปล่า สิ่งเดียวกันกับอินเตอร์เฟสอีเธอร์เน็ต
หวังว่านี่จะช่วยใครซักคน! :-)
แก้ไข:
มันชี้ให้เห็น (ขอบคุณ @NasBanov) ว่าถึงแม้ว่าฟังก์ชั่นนี้จะเกี่ยวกับการดึงที่อยู่ IP ในทางที่ดีกว่าการใช้Dns.GetHostEntry(Dns.GetHostName())
มันไม่ได้เป็นอย่างดีในการรองรับหลาย ๆ อินเตอร์เฟสของชนิดเดียวกันหรือหลาย IP ที่อยู่บนอินเตอร์เฟสเดียว . มันจะส่งคืนที่อยู่ IP เดียวเมื่ออาจมีหลายที่อยู่ที่ได้รับมอบหมาย ในการส่งคืนที่อยู่ที่ได้รับมอบหมายทั้งหมดเหล่านี้คุณสามารถจัดการฟังก์ชั่นดั้งเดิมเพื่อส่งกลับอาร์เรย์เสมอแทนที่จะเป็นสตริงเดียว ตัวอย่างเช่น:
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();
}
ตอนนี้ฟังก์ชั่นนี้จะคืนค่าที่อยู่ที่ได้รับมอบหมายทั้งหมดสำหรับประเภทอินเตอร์เฟสเฉพาะ ตอนนี้รับเพียงสตริงเดียวคุณสามารถใช้.FirstOrDefault()
ส่วนขยายเพื่อส่งกลับรายการแรกในอาร์เรย์หรือถ้ามันว่างเปล่ากลับสตริงที่ว่างเปล่า
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
คำสั่งนี้ดูเหมือนจะขัดแย้งกัน คุณพยายามคิดหรือไม่ว่าคอมพิวเตอร์ของคุณเชื่อมต่อกับ LAN ส่วนตัวหรืออินเทอร์เน็ต?