Я использую библиотеку, которая выполняет некоторые работы nework, и когда клиент подключается, эта библиотека предоставляет «struct sockaddr *», который содержит клиентский сокет. Я просто хотел, чтобы извлечь IP и порт, и я делаю это в настоящее время так:C/C++ getnameinfo ai_family не поддерживается
#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;
}
При использовании IPv4 на моем Mac, это работает. Если я использую это приложение на моем сервере Gentoo Linux с полной поддержкой IPv6, я только получаю:
Ошибки: ai_family не поддерживается
Соединительный клиент имеет AAAA и ip6 запись на месте.
Я добавил несколько цитат и напечатал hostaddr-> sa_family, который возвращает 10, это AF_INET6.
Почему это не работает? :-)
Есть ли способ узнать, если sockaddr несет IPv4 или IPv6? –
извините. конечно. я просто проверяю sa_family –