Gå til innhold

C# Finne lokale IP på subnettet til default gateway


Anbefalte innlegg

Hei,

 

Jeg skal forwarde porter automatisk via UPnP i filtjener-programmet mitt, og jeg har koden under, som funker, men kun for min subnet IP.

private void NotifySubnetUp()
{
NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection port_mappings = upnpnat.StaticPortMappingCollection;

if (port_mappings == null)
	return;

try { port_mappings.Add(m_port, "TCP", m_port, "192.168.0.102", true, "SSFT"); }
catch (Exception) { }
}

Problemet er at jeg ikke vet hvordan jeg kan finne den lokale IP-en som er gunstig å gi som argument. Jeg tenkte å finne min lokale IP på subnettet til default gateway, men er usikker på hvor jeg finner dette i C#.NET?

Endret av LostOblivion
Lenke til kommentar
Videoannonse
Annonse

var nets = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

Nå har jeg aldri gjort dette før, men etter det jeg vet, så kan du i det minste gå igjennom denne listen og lete etter et network interface med en gateway eller DHCP server satt, så burde det være riktig nettverk.

Lenke til kommentar

Jeg kommer ikke fram til noen automatisk oppdaget IP som er lik den jeg har på subnettet til gatewayen min (192.168.0.102)...lurer på hvordan Skype gjør det...

 

Hadde vært dritkult om jeg fant IP-en til den som kjører programmet og får åpnet opp med UPnP, men foreløpig gir jeg snart opp.

 

Kuriositet: Hva gjør man om det er flere gateways mellom host og internett? Eller funker UPnP kun på subnettet? :/

Endret av LostOblivion
Lenke til kommentar

hadde behov for å finne ipadresse til noen hyper-v vmwer her i går. Da fikk jeg hostname som input, men en kan benytte System.net.DNS.getHostName() uten parametere for å finne hostname til pcen. Deretter kan en bruke dnsoppslag for å finne ip-adressene. Her har jeg noe kode som demonstrerer:

 

$dns = [System.net.DNS]
$hostname = $dns::getHostName()
$ips = $dns::getHostEntry($hostname).AddressList
$ips | foreach{
echo $_.toString()
}

 

PS C:\Users\bjorninge> $dns = [system.net.DNS]

PS C:\Users\bjorninge> $hostname = $dns::getHostName()

PS C:\Users\bjorninge> $ips = $dns::getHostEntry($hostname).AddressList

PS C:\Users\bjorninge> $ips | foreach{

>> echo $_.toString()

>> }

>>

fe80::7d3a:a403:c1b:XXXX%XX

fe80::3d5f:ef19:724a:XXXX%XX

10.0.0.2

192.168.56.1

PS C:\Users\bjorninge>

 

Så får du ta jobben med å konvertere til c# sjøl ;)

Lenke til kommentar

Det der gav meg ingenting utover det jeg allerede vet, men takk uansett.

 

Det er ikke noe problem å finne IP-adressene til lokalmaskinen jf DNS, men jeg må finne den riktige som er en del av subnettet til default gateway til lokalmaskinen. Hvis default gateway er 192.168.0.1 og DNS sier bl a 192.168.0.102, så er siste den IP-adressen jeg er ute etter.

 

Jeg prøver å finne subnet-masken til default gateway og så finne hvilken av DNS-IP-ene for lokalmaskinen som er på dette subnettet ved å maske default gateway og de DNS sier, og sammenligne disse på den gamle måten. Men finner ikke subnet masken til default gateway noe sted. :(

 

Dessuten er jeg litt overrasket at dette skulle være så utrolig vanskelig bare for å finne lokale subnet IP-en som leder til internett. Er nok mangel på kompetanse fra min side og...

Lenke til kommentar

Jeg jobbet nettopp med noe tilsvarende problemstilling. Her er en kodesnutt som viser relevant informasjon om nettverksinterface.

 



foreach (NetworkInterface iface in NetworkInterface.GetAllNetworkInterfaces())
{
   Console.WriteLine("IPInterfaceProperties " + iface.Name + "   Opstatus " + iface.OperationalStatus);
   if (iface.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
   {
       IPInterfaceProperties ipprps = iface.GetIPProperties();

       IPAddressCollection ipaddcol = ipprps.DhcpServerAddresses;
       foreach (IPAddress ipa in ipaddcol)
       {
           Console.WriteLine("DHCP Server address " + ipa.ToString());
       }

       IPAddressCollection ipaddcol2 = ipprps.DnsAddresses;
       foreach (IPAddress ipa in ipaddcol2)
       {
           Console.WriteLine("DNS Server address " + ipa.ToString());
       }

       GatewayIPAddressInformationCollection gatewayAddr = ipprps.GatewayAddresses;
       foreach (GatewayIPAddressInformation gwipad in gatewayAddr)
       {
           Console.WriteLine("Gateway address " + gwipad.Address);
       }
       Console.WriteLine("DNS suffix " + ipprps.DnsSuffix + "  DNS enabled " + ipprps.IsDnsEnabled);

       IPv4InterfaceProperties ip4pprs = ipprps.GetIPv4Properties();
       Console.WriteLine("DHCP enabled " + ip4pprs.IsDhcpEnabled);

       UnicastIPAddressInformationCollection uniCast = ipprps.UnicastAddresses;
       if (uniCast.Count > 0)
       {
           foreach (UnicastIPAddressInformation uni in uniCast)
           {
               Console.WriteLine("  Unicast Address ......................... : {0}", uni.Address);
               Console.WriteLine("  Unicast Mask    ......................... : {0}", uni.IPv4Mask);
           }
       }
   }
Console.WriteLine("");

 

Endret av Hårek
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...