-
February 1st, 2012, 12:39 PM
#1
[RESOLVED] discover real card and real ip address of my machine without calling directly WMI
A friend of mine was trying to get valid lan ip from machine.
Depending on Os and on installed programs (ie: Vmware), he could find more than one apparently valid IP
We searched for a way to discover the real one without pinging and
without using WMI.
We apparently found a "dirty" solution.
Question is: anybody knows a better way (without wmi) ?
Code:
//digged, builded and (here and there) copyed as is from web, without paying attention to style. PLease, do not shot to me for this
public static void DisplayIPAddresses()
{
Console.WriteLine("\r\n****************************");
Console.WriteLine(" IPAddresses");
Console.WriteLine("****************************");
StringBuilder sb = new StringBuilder();
// Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface network in networkInterfaces)
{
if (network.OperationalStatus == OperationalStatus.Up )
{
if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue;
if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue;
//GatewayIPAddressInformationCollection GATE = network.GetIPProperties().GatewayAddresses;
// Read the IP configuration for each network
IPInterfaceProperties properties = network.GetIPProperties();
//discard those who do not have a real gateaway
if (properties.GatewayAddresses.Count > 0)
{
bool good = false;
foreach (GatewayIPAddressInformation gInfo in properties.GatewayAddresses)
{
//not a true gateaway (VmWare Lan)
if (!gInfo.Address.ToString().Equals("0.0.0.0"))
{
sb.AppendLine(" GATEAWAY "+ gInfo.Address.ToString());
good = true;
break;
}
}
if (!good)
{
continue;
}
}
else {
continue;
}
// Each network interface may have multiple IP addresses
foreach (IPAddressInformation address in properties.UnicastAddresses)
{
// We're only interested in IPv4 addresses for now
if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue;
// Ignore loopback addresses (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address)) continue;
if (!address.IsDnsEligible) continue;
if (address.IsTransient) continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ") nType:" + network.NetworkInterfaceType.ToString() );
}
}
}
Console.WriteLine(sb.ToString());
}
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 1st, 2012, 05:22 PM
#2
Re: discover real card and real ip address of my machine without calling directly WMI
There's nothing wrong or 'dirty' with that method at all. That's the way you're supposed to obtain all the network interfaces and you do filter out ones which are not suitable for your purposes in a reasonable way. What's not to like?
www.monotorrent.com For all your .NET bittorrent needs
NOTE: My code snippets are just snippets. They demonstrate an idea which can be adapted by you to solve your problem. They are not 100% complete and fully functional solutions equipped with error handling.
-
February 2nd, 2012, 12:07 AM
#3
Re: discover real card and real ip address of my machine without calling directly WMI
I hoped there was a more direct way to find out the enabled lan ip filtering out the virtual addresses.
What I do not like?
The code I posted is written in a hurry, and in the aim of experiment. It could be written better.
The idea to look at gateaway infos to discard not really enabled lan ip might seem to work, but it is not a "this is a virtual address" method. This is a "workaround", and so an indirect method to try to find what we where looking for.
ps
Thanks for looking at this.
Last edited by Cimperiali; February 2nd, 2012 at 12:10 AM.
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 11th, 2012, 06:03 PM
#4
Re: discover real card and real ip address of my machine without calling directly WMI
this is final solution my colleague opted for. Note it uses the "old" (but in this case well working) System.Runtime.Remoting.Channels.Tcp
Code:
using System;
using System.Collections.Generic;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
public class MyClass
{
public static void Main()
{
// Create the server channel.
TcpChannel tcpChannel = new TcpChannel(22);
// Register the server channel.
ChannelServices.RegisterChannel(tcpChannel,false);
// Show the URIs associated with the channel.
ChannelDataStore data = (ChannelDataStore) tcpChannel.ChannelData;
foreach (string uri in data.ChannelUris)
{
int len = uri.Length;
Console.WriteLine("IP: {0}", uri.Substring(6,len-9));
}
// Unregister the server channel.
ChannelServices.UnregisterChannel(tcpChannel);
Console.ReadLine();
}
#region Helper methods
#endregion
}
Last edited by Cimperiali; February 11th, 2012 at 06:07 PM.
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|