Hallo MikeK,
ich habe das mal in einer C++ Klasse so gebaut das es ohne Änderung mit IPv4 und IPv6 funktioniert.
Die Log-Klasse gibt es bei Dir natürlich nicht.
Der folgenden Teil macht die Auflösung von Domainnamen zu IP Adresse:
Code:
// Parameter so einstellen das Ipv4 und Ipv6 Adressen gesucht werden.
stIntParameter = {0};
stIntHostInfo = {0};
stIntParameter.ai_family = AF_UNSPEC; // Beide Versionen IPv4 und IPv6
stIntParameter.ai_socktype = SOCK_STREAM; // Tcp Stream Socket
// Suche die Daten zu Netzwerkschnittstelle.
int iRc = getaddrinfo (strIntDomainName.c_str (), NULL, &stIntParameter, &stIntHostInfo);
if (iRc != 0)
{
// Debug Messages
pIntLog->setLogLevel ("Error");
pIntLog->sendMessage (std::string (__FILE__) + " - Call: DnsClient::getIpAdr () - getaddrinfo: " + gai_strerror (iRc));
pIntLog->sendMessage (std::string (__FILE__) + " - Call: DnsClient::getIpAdr () - Namensauflösung fehlgeschlagen (Name falsch oder keine Netzwerkverbindung)");
exit (1);
}
Hier wird dann die zurückgegebene IP-Adresse in eine String umgewandelt.
Code:
// IP-Adresse in einen String umwandeln.
// stIntHostInfo ist eine verkettete Liste z.B wenn eine Domain mehrere IP-Adressen hat.
struct addrinfo *aktHostInfo;
std::vector<char> vecIpAdr;
vecIpAdr.resize (INET6_ADDRSTRLEN);
// Suche den passenden Eintrag für die gewünschte IP-Adresse.
void *Adr;
for (aktHostInfo = stIntHostInfo; aktHostInfo != NULL; aktHostInfo = aktHostInfo->ai_next)
{
std::string strIpVer;
// Verschiedene Felder für IPv4 und IPv6
if (aktHostInfo->ai_family == AF_INET)
{
struct sockaddr_in *ipv4 = (struct sockaddr_in *) aktHostInfo->ai_addr;
Adr = &(ipv4->sin_addr);
strIpVer = "IPv4";
break;
}
else
{
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) aktHostInfo->ai_addr;
Adr = &(ipv6->sin6_addr);
strIpVer = "IPv6";
break;
}
}
// Konvertiere die IP in einen String und printe es
inet_ntop (aktHostInfo->ai_family, Adr, vecIpAdr.data (), vecIpAdr.size ());
// IP-Adresse in einen String kopieren.
// Die folgenden Zeilen zeigen einige Methoden wie man den String aus einem char std::vector in einen std::string bekommt.
//std::string strIpAdr (vecIpAdr.data (), vecIpAdr.size ());
//std::string strIpAdr (vecIpAdr.begin (), vecIpAdr.end ());
std::string strIpAdr;
strIpAdr.assign (vecIpAdr.data ());
// Debug Messages
pIntLog->setLogLevel ("Debug");
pIntLog->sendMessage (std::string (__FILE__) + " - Call: DnsClient::getIpAdr () - " + strIpAdr);
Ich habe in meinem GIT noch weitere Sachen zur Netzwerkprogrammierung. Die Beispiele sind aber aktuell nicht direkt Übersetzbar weil ich erst einige Anpassungen wegen Änderungen in meinen Klassen noch umsetzen muss. Der GIT Server ist nur über IPv6 erreichbar weil IPv4 Adressen selten und teuer sind.
Vielleicht hilft es Dir ja weiter: https://git.hts-software.de
Unterordner: Athena-Api dann den Menüpunkt "tree" und dann den Ordner: Netzwerk
Lesezeichen