Ich benutze eine Bibliothek, die einige Nework Zeug macht und wenn ein Client verbindet, bietet diese Bibliothek eine "struct sockaddr *", die den Client-Socket hält. Ich wollte einfach die IP und den Port extrahieren und ich tue es derzeit so aus:C/C++ Getnameinfo Ai_Family nicht unterstützt
#include <sys/socket.h>
#include <netdb.h>
const std::string Client::prepareIPandPort(struct sockaddr *hostaddr) {
assert(hostaddr != nullptr);
std::string ipport;
char clienthost[NI_MAXHOST];
char clientport[NI_MAXSERV];
int result = getnameinfo(hostaddr, sizeof(*hostaddr),
clienthost, sizeof(clienthost),
clientport, sizeof(clientport),
NI_NUMERICHOST | NI_NUMERICSERV);
if (result != 0) {
std::cerr << "Error: " << gai_strerror(result) << std::endl;
ipport = "unknown";
} else {
switch (hostaddr->sa_family) {
case AF_INET:
ipport = std::string {clienthost} + ":"
+ std::string {clientport};
break;
case AF_INET6:
ipport = "[" + std::string {clienthost} + "]:"
+ std::string {clientport};
break;
default:
ipport = "unknown";
}
}
return ipport;
}
Bei der Verwendung von IPv4 auf meinem Mac, es funktioniert. Wenn ich diese Anwendung auf meinem Gentoo Linux-Server mit voller Unterstützung IPv6 verwenden, erhalte ich nur:
Fehler: ai_family nicht unterstützt
Der Verbindungs Client AAAA und IP6 Aufzeichnungen in Platz hat.
Ich fügte einige couts hinzu und druckte hostaddr-> sa_family, das 10 zurückgibt, das AF_INET6 ist.
Warum funktioniert das nicht? :-)
Gibt es eine Möglichkeit herauszufinden, ob der Sockaddr IPv4 oder IPv6 trägt? –
Entschuldigung. Na sicher. Ich überprüfe einfach sa_family –