Nichts ist entspannter als ein Einkaufbummel im Internet. Und wenn man die Einkauftour rechtzeitig beginn bekommt auch keinen Stress mit den Lieferzeiten.
Um aber trotzdem an sein Paket zu kommen muss man natürlich seine eigene Adresse mitteilen.
Gleiches gilt auch für Anwendung die auf Netzwerkdienste zugreifen. Oftmals muss die Anwendung die eigene IP Adresse nicht kennen, da es durch die zugrunde liegenden Protokolle automatisch passiert. Ab und an kann es aber vorkommen dass diese Information benötigt wird.
Dazu kann das folgende Codeschnipsel verwendet werden:
C++
#include "iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")
…
//Wir listen mal etwas mehr auf als nur die aktuellen IPs.
//Adapter Information anlegen
PIP_ADAPTER_INFO pAdapterInfo;
ULONG lRetLen = sizeof(PIP_ADAPTER_INFO);
//Benötigte Speichergrösse holen
DWORD dwRet = GetAdaptersInfo(NULL,&lRetLen);
//Informationen zu allen Adaptern holen
pAdapterInfo = (PIP_ADAPTER_INFO) malloc (lRetLen);
dwRet = GetAdaptersInfo(pAdapterInfo,&lRetLen);
if(dwRet == ERROR_SUCCESS)
{
//Informationen nur für den aktuellen Adapter
PIP_ADAPTER_INFO pCurrentAdapter = pAdapterInfo;
while (pCurrentAdapter != NULL )
{
//Systemindex
printf("Adapterindex: %in",pCurrentAdapter->Index);
//Beschreibung
printf("Beschreibung: %sn",pCurrentAdapter->Description);
//IP Addresse
printf("IP: %sn",pCurrentAdapter->IpAddressList.IpAddress.String);
//Gateway
printf("Gateway: %sn",pCurrentAdapter->GatewayList.IpAddress.String);
//Subnet
printf("Subnet: %sn",pCurrentAdapter->IpAddressList.IpMask.String);
//Erweiterte IP Infos anlegen
PIP_PER_ADAPTER_INFO pPerAdapterInfo;
lRetLen = sizeof(PIP_PER_ADAPTER_INFO);
//Benötigte Speichergrösse holen
dwRet = GetPerAdapterInfo(pCurrentAdapter->Index,NULL,&lRetLen);
//Erweiterte IP Infos abfragen
pPerAdapterInfo = (PIP_PER_ADAPTER_INFO) malloc (lRetLen);
dwRet = GetPerAdapterInfo(pCurrentAdapter->Index,pPerAdapterInfo,&lRetLen);
//DNS1
printf("DNS: %sn",pPerAdapterInfo->DnsServerList.IpAddress.String);
//DNS2
if(pPerAdapterInfo->DnsServerList.Next != NULL)
printf("DNS2: %sn",pPerAdapterInfo->DnsServerList.Next->IpAddress.String);
//Interface anlegen
MIB_IFROW IfRow;
memset( &IfRow, NULL, sizeof( MIB_IFROW ) );
//Index zum abfragen setzen
IfRow.dwIndex = pCurrentAdapter->Index;
//Interface abfragen
GetIfEntry(&IfRow);
//MAC Adresse
printf("MAC: %02x-%02x-%02x-%02x-%02x-%02xn",IfRow.bPhysAddr[0], IfRow.bPhysAddr[1], IfRow.bPhysAddr[2], IfRow.bPhysAddr[3], IfRow.bPhysAddr[4], IfRow.bPhysAddr[5]);
//Den Namen(ClassID) brauchen wir auch…
printf("ClassID: %sn",pCurrentAdapter->AdapterName);
//Nächster Adapter
pCurrentAdapter = pCurrentAdapter->Next;
}
}
C#
In C# geht dies ebenfalls ganz einfach, auch wenn es wild aussieht:
using System.Net;
…
IPHostEntry enty = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ipadress in enty.AddressList)
{
Console.WriteLine("IP: " + ipadress.ToString());
}
Patrick & Peter