IP adres van de Netwerk adapter met een internet verbinding verkrijgen

Status
Niet open voor verdere reacties.

tim687

Terugkerende gebruiker
Lid geworden
25 apr 2010
Berichten
1.774
Beste leden,

Voor een project heb ik een IP adres nodig van de netwerk kaart waarmee de computer op internet is verbonden.

Ik gebruik deze code:
Code:
private string getLocalIP() {
      IPHostEntry host;
      string localIP = "?";
      host = Dns.GetHostEntry(Dns.GetHostName());
      foreach (IPAddress ip in host.AddressList) {
        if (ip.AddressFamily == AddressFamily.InterNetwork) {
          localIP = ip.ToString();
        }
      }
      return localIP;
    }

Ik heb ook deze code geprobeert:

Code:
localIP = System.Net.Dns.GetHostByName(Environment.MachineName).AddressList[0].ToString();

Beide codes geven het verkeerde IP adres.
Hoe moet ik dit oplossen?

Bedankt,
Tim
 
????? Je doet DNS resolving terwijl je praat over ip-adres??

Ik neem aan dat je eigenlijk bedoelt dat je pc een verbinding hebt opgebouwd met "iets op Internet" danwel dat "iets op Internet" een verbinding heeft met jouw pc. Dan zul je de lopende verbindingen moeten uitlezen (sockets dus); DNS heb je daar niet bij nodig...

Tijs.
 
Het is inderdaad een beetje onduidelijk.
Eigenlijk wil ik het IP adres hebben van de computer waar het programma op draait (het lokale ip adres)
Dit is de code die ik uit de broncode van een ander programma heb gehaald, de code was bedoelt om dat te doen, maar houdt geen rekening met meerdere netwerkkaarten, dat probleem heb ik nu dus.
Dus mijn vraag is dan ook:

Hoe moet ik het lokale IP adres van de netwerk kaart die met internet verbonden is verkrijgen?

Bedankt,
Tim
 
Zelf ook wat code gegoogled (enumeratie/'opsomming'):
Code:
foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
  {
    Console.WriteLine("Name: " + netInterface.Name);
    Console.WriteLine("Description: " + netInterface.Description);
    Console.WriteLine("Addresses: ");
    IPInterfaceProperties ipProps = netInterface.GetIPProperties();
    foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
    {
      Console.WriteLine(" " + addr.Address.ToString());
    }
    Console.WriteLine("");
  }

Hiermee heb je nog niet helder wélke netwerkkaart / ip-adres combi Internet-toegang heeft, maar lijkt me al 400% beter dan wat je in je startposting had staan.

Geef ons eens de uitvoer van bovenstaande code als je het bij jou uitvoert?

Tijs.
 
Dankje!

Maakt het uit als ik het morgen probeer?
Ik moet nu naar een verjaardag.
Tim
 
Geen probleem. Je bent ook niet van mij afhankelijk voor een antwoord, nietwaar? :) Er zijn meer bezoekers dan alleen ik.

Tijs.
 
1) Is er niet ook ergens een parameter voor default gateway. Er zal namelijk maar 1 connectie zijn waarbij de default gateway is ingevuld.
2) Daarnaast is er nog een test nodig welke kaart enabled is.

De combinatie van 1 en 2 zou moeten aangeven welke kaart op dit moment verbonden is met internet.
 
Beide kaarten zijn enabled, en hebben 2 verschillende ip adressen.
Ik zal straks even naar de code kijken
 
Dat zal vast. Ik probeerde het algemeen te houden zodat het werkt voor bijna alle systemen.
 
Dat is ook zeker de bedoeling voor dit project!
Uw hulp is zeker niet ondergewaardeerd, ik zal kijken naar een manier om dat te implementeren

Bedankt,

Tim
 
Zelf ook wat code gegoogled (enumeratie/'opsomming'):
Code:
foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
  {
    Console.WriteLine("Name: " + netInterface.Name);
    Console.WriteLine("Description: " + netInterface.Description);
    Console.WriteLine("Addresses: ");
    IPInterfaceProperties ipProps = netInterface.GetIPProperties();
    foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
    {
      Console.WriteLine(" " + addr.Address.ToString());
    }
    Console.WriteLine("");
  }

Hiermee heb je nog niet helder wélke netwerkkaart / ip-adres combi Internet-toegang heeft, maar lijkt me al 400% beter dan wat je in je startposting had staan.

Geef ons eens de uitvoer van bovenstaande code als je het bij jou uitvoert?

Tijs.


De uitvoer van die code is:

Code:
Name: Local Area Connection 5
Description: TAP-Windows Adapter V9 #3
Addresses: 
 fe80::4d0b:42c7:13d7:dc2e%12
 169.254.220.46

Name: Local Area Connection 4
Description: TAP-Win32 Adapter OAS #2
Addresses: 
 fe80::656a:1ea7:66b2:c17b%11
 169.254.193.123

Name: Local Area Connection 2
Description: TAP-Windows Adapter V9 #2
Addresses: 
 fe80::41e5:f23b:c2e8:7e2b%10
 169.254.126.43

Name: Local Area Connection 3
Description: TAP-Win32 Adapter OAS
Addresses: 
 fe80::6019:49ec:19fc:c9bd%5
 169.254.201.189

Name: Local Area Connection
Description: TAP-Windows Adapter V9
Addresses: 
 fe80::8962:92b2:5415:f668%4
 169.254.246.104

Name: Ethernet
Description: Realtek PCIe GBE Family Controller
Addresses: 
 fe80::788f:9093:c9e4:701f%3
 192.168.8.186

Name: VirtualBox Host-Only Network
Description: VirtualBox Host-Only Ethernet Adapter
Addresses: 
 fe80::3502:7a1f:ea3d:1815%19
 192.168.56.1

Name: Loopback Pseudo-Interface 1
Description: Software Loopback Interface 1
Addresses: 
 ::1
 127.0.0.1

Name: isatap.{A0C885E8-6826-442F-ADB1-4B708E26BF2B}
Description: Microsoft ISATAP Adapter #2
Addresses: 

Name: isatap.{E94C0BFF-EBE1-46E6-AE8B-93F94CC56D76}
Description: Microsoft ISATAP Adapter #3
Addresses: 
 fe80::5efe:192.168.56.1%8

Name: isatap.{441F7728-B622-42FE-B513-EB272C4FCA51}
Description: Microsoft ISATAP Adapter #4
Addresses: 
 fe80::5efe:169.254.193.123%21
 
Alle adapters die een 169.254.x.x ip-adres hebben kun je in je code uitfilteren, want die hebben een ip-adres dat niet wordt gerouteerd en hebben dus zeker geen Internet.

Tijs.
 
Ik heb de code gefilterd en nu is dit mijn uitkomst:

Code:
Name: Local Area Connection 5
Description: TAP-Windows Adapter V9 #3
Addresses: 
 fe80::4d0b:42c7:13d7:dc2e%12

Name: Local Area Connection 4
Description: TAP-Win32 Adapter OAS #2
Addresses: 
 fe80::656a:1ea7:66b2:c17b%11

Name: Local Area Connection 2
Description: TAP-Windows Adapter V9 #2
Addresses: 
 fe80::41e5:f23b:c2e8:7e2b%10

Name: Local Area Connection 3
Description: TAP-Win32 Adapter OAS
Addresses: 
 fe80::6019:49ec:19fc:c9bd%5

Name: Local Area Connection
Description: TAP-Windows Adapter V9
Addresses: 
 fe80::8962:92b2:5415:f668%4

Name: Ethernet
Description: Realtek PCIe GBE Family Controller
Addresses: 
 fe80::788f:9093:c9e4:701f%3
 192.168.8.186

Name: VirtualBox Host-Only Network
Description: VirtualBox Host-Only Ethernet Adapter
Addresses: 
 fe80::3502:7a1f:ea3d:1815%19
 192.168.56.1

Name: Loopback Pseudo-Interface 1
Description: Software Loopback Interface 1
Addresses: 
 ::1
 127.0.0.1

Name: isatap.{A0C885E8-6826-442F-ADB1-4B708E26BF2B}
Description: Microsoft ISATAP Adapter #2
Addresses: 

Name: isatap.{E94C0BFF-EBE1-46E6-AE8B-93F94CC56D76}
Description: Microsoft ISATAP Adapter #3
Addresses: 
 fe80::5efe:192.168.56.1%8

Name: isatap.{441F7728-B622-42FE-B513-EB272C4FCA51}
Description: Microsoft ISATAP Adapter #4
Addresses:
 
Nu nog even uitzoeken welke attributen er in de class Networkinterface zitten, zodat je ook kunt filteren op wel/geen standaardgateway.
Zonder standaardgateway wordt er niet gerouteerd, en is er (dus) geen internet [overigens hoef je dan ook niet meer te filteren op 169.254.x.x, want... die heeft ook geen standaardgateway)...
Ik suggereer hier dus de eerdere tip van RogerS m.b.t. filteren op wel/niet standaardgateway gedefinieerd.

Tijs.
 
Ik zal de code implementeren om de standaardgateway te vinden.

Is deze code de goeie code?

Code:
public static IPAddress GetDefaultGateway()
{
    var card = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault();
    if(card == null) return null;
    var address = card.GetIPProperties().GatewayAddresses.FirstOrDefault();
    return address.Address;
}


EDIT:

De code hierboven WERKT NIET zoals ik wil dat deze werkt.

Ik heb het zo opgelost:

Code:
foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
        {
            
            var defaultGateway =
   from nics in NetworkInterface.GetAllNetworkInterfaces()
   from props in nics.GetIPProperties().GatewayAddresses
   where nics.OperationalStatus == OperationalStatus.Up
   select props.Address.ToString();
            
            GatewayIPAddressInformationCollection prop = netInterface.GetIPProperties().GatewayAddresses;

            if(defaultGateway.First() != null){

            Debug.WriteLine("Name: " + netInterface.Name);
            Debug.WriteLine("Description: " + netInterface.Description);
            Debug.WriteLine("Addresses: ");
            IPInterfaceProperties ipProps = netInterface.GetIPProperties();
 
            foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
            {
                
                if (addr.Address.ToString().Contains(defaultGateway.First().Remove(defaultGateway.First().LastIndexOf("."))))
                {
                    Debug.WriteLine(" " + addr.Address.ToString());
                    if (Localip == "?") // check if the string has been changed before
                    {
                        Localip = addr.Address.ToString();
                    }
                }
                
            }

            }
            Debug.WriteLine("");
  
        }
        Debug.WriteLine("The ip address of this computer is: " + Localip);
        return Localip;

Hierbij krijg ik keurig deze output:

Code:
Name: Ethernet
Description: Realtek PCIe GBE Family Controller
Addresses: 
 192.168.8.186

Name: VirtualBox Host-Only Network
Description: VirtualBox Host-Only Ethernet Adapter
Addresses: 

Name: Loopback Pseudo-Interface 1
Description: Software Loopback Interface 1
Addresses: 

Name: isatap.{A0C885E8-6826-442F-ADB1-4B708E26BF2B}
Description: Microsoft ISATAP Adapter
Addresses: 
 fe80::5efe:192.168.8.186%4
	
Name: isatap.{E94C0BFF-EBE1-46E6-AE8B-93F94CC56D76}
Description: Microsoft ISATAP Adapter #3
Addresses: 
	
The ip address of this computer is: 192.168.8.186

Het ip adres wat onderaan staat is ook zeker mijn ip adres, alleen vraag ik me af wat de rest eromheen is.
 
Laatst bewerkt:
Hartelijk bedankt voor jullie hulp!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan