Bwall張貼在this thread.
foreach(NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
if(ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
{
Console.WriteLine(ni.Name);
foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
Console.WriteLine(ip.Address.ToString());
}
}
}
}
在這段代碼最重要的是,它僅列出了以太網和無線接口的IP地址,一個合適的解決方案。我懷疑你會有一個串行連接活動,所以這不會很重要。另外你可以隨時編輯if語句。
//編輯 如果你只想IP實際連接到互聯網使用Hosam Aly的solution
地址這是他的代碼:
static IPAddress getInternetIPAddress()
{
try
{
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress gateway = IPAddress.Parse(getInternetGateway());
return findMatch(addresses, gateway);
}
catch (FormatException e) { return null; }
}
static string getInternetGateway()
{
using (Process tracert = new Process())
{
ProcessStartInfo startInfo = tracert.StartInfo;
startInfo.FileName = "tracert.exe";
startInfo.Arguments = "-h 1 www.example.com
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
tracert.Start();
using (StreamReader reader = tracert.StandardOutput)
{
string line = "";
for (int i = 0; i < 5; ++i)
line = reader.ReadLine();
line = line.Trim();
return line.Substring(line.LastIndexOf(' ') + 1);
}
}
}
static IPAddress findMatch(IPAddress[] addresses, IPAddress gateway)
{
byte[] gatewayBytes = gateway.GetAddressBytes();
foreach (IPAddress ip in addresses)
{
byte[] ipBytes = ip.GetAddressBytes();
if (ipBytes[0] == gatewayBytes[0]
&& ipBytes[1] == gatewayBytes[1]
&& ipBytes[2] == gatewayBytes[2])
{
return ip;
}
}
return null;
}
它通常做的,是跟蹤到www.example.com的路由並從那裏處理正確的IP。我測試了我的機器上的代碼,並需要將迭代從9更改爲5,以便從流中獲取正確的代碼。你最好重新檢查一下,否則你可能會陷入NullReferenceException,因爲line
將會是null
。
你是什麼意思「活躍」? PC可以有很多IP地址,多個可以被認爲是活動的。 –
我想知道哪個IP代表本地網絡上的PC –
檢查連接的一個:System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); – Stefan